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;
}
运行结果: