system函数
#include <stdlib.h>
*int system(const char command);
system函数在linux中的源代码:
int system(const char * cmdstring)
{pid_t pid;int status;if(cmdstring == NULL){return (1);}if((pid = fork())<0){status = -1;}else if(pid == 0){ //子进程execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);-exit(127); //子进程正常执行则不会执行此语句}else{while(waitpid(pid, &status, 0) < 0){if(errno != EINTER){status = -1;break;}}}return status;
}
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(){//pid_t getpid(void);pid_t pid;int data;while(1){printf("please input a data\n");scanf("%d",&data);if(data == 1){pid = fork();if(pid > 0){wait(NULL);}if(pid == 0){//execl("./myChange","myChange",NULL);system("./myChange");}}else{printf("wait,no request\n");}}return 0;
}
system使用起来会比exec更简洁,另外exec在运行时跳入新的可执行程序之后不会再运行之后的代码,而system调用结束后,后续的代码还会执行:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void){printf("before execl\n");//int execl(const char *path, const char *arg, ...);//if(execlp("ls","ls","-l",NULL) == -1)if(system("ls")){printf("execl failed\n");perror("why");}printf("after execl\n");return 0;
}
调用完可执行程序后,还会运行之后的代码。
popen函数
**FILE *popen(const char command, const char type);
参数说明
command:是一个指向以NULL结束的shell命令字符串的指针。这行命令与system类似,传到bin/sh并使用-c标志,shell将执行这个命令。
mode:r——标准输出
w——标准输入
返回值
如果调用成功,返回值是一个FILE*,如果失败返回NULL。相比于system来说可以捕获返回值。
读取command指向的数据到popen开辟的管道当中,并将管道中的数据读取到ret中:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(){char ret[1024] = {0};FILE* fp;fp = popen("ls","r");//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);int nread = fread(ret,1,1024,fp);printf("read ret %d byte,ret =\n %s\n",nread,ret);return 0;
}
运行结果: