1.system
#include <stdlib.h>int system(const char *command);
返回值:
成功,则返回进程的状态值;不能源码execl函数,返回127;失败返回-1;
不能成功运行分析文章:linux下system函数详解_linux system_遥_望的博客-CSDN博客
在linux系统下,system函数是execl函数的封装版
popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:成功 /失败
源码:
#include
#include
#include
#includeint 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;
}
在linux系统下,system函数是execl函数的封装版
文中的 "sh -c ps"
和我们所使用的"ps"
是完全等价的
例子代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{system("ps");printf("\n");
}
直接运行ps指令;
运行文件:
#include <stdio.h>
int main(int argc,char *argv[])
{int i;for(i=0;i<argc;i++){printf("argv[%d]:%s\n",i,argv[i]);}return 0;
}
system运行:
#include <stdio.h>
#include <stdlib.h>
int main()
{system("./test aa bb cc dd");printf("\n");
}
结果:
argv[0]:./test //程序地址
argv[1]:aa //以下为程序参数
argv[2]:bb
argv[3]:cc
argv[4]:dd
还可以运行子进程中的其他程序:
在Linux文件编程中
写一个TEST.config文件:
SPEED=5
LENG=1
SCORE=90
LEVEL=95
对TEST.config文件内容进行修改,将LENG=1,改成LENG=5
代码:
#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(int argc,char **argv)
{int fdsrc;char *readbuf=NULL;if(argc!=2){printf("pararm error\n");exit(-1);//tuichugaichengxu}//打开文件,将文件复制到readbuf中fdsrc=open(argv[1],O_RDWR);int size=lseek(fdsrc,0,SEEK_END);lseek(fdsrc,0,SEEK_SET);readbuf=(char *)malloc(sizeof(char)*size+8);int n_read=read(fdsrc,readbuf,size);//找到readbuf中LENG=中的位置,将位置移动到1,替换为5char *p=strstr(readbuf,"LENG=");if(p==NULL){printf("not found\n");exit(-1);}p=p+strlen("LENG=");*p='5';//移动光标到文件头,重新将readbuf中的内容写入到打开的文件中lseek(fdsrc,0,SEEK_SET);int n_write=write(fdsrc,readbuf,strlen(readbuf));close(fdsrc);return 0;
}
编译:gcc demo13.c运行:./a.out TEST.config
运行结果为:
SPEED=5
LENG=5
SCORE=90
LEVEL=95
system运用:
将上述代码编译为./changedata
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>int main()
{pid_t pid;int data=10;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("./changedata","changedata","config.txt",NULL);system("./changedata config.txt");exit(0);}}else{printf("wait,do nothing\n"); }}return 0;
}
cat config.txt
能够发现LENG=1变成了LENG=5
要注意的是,system运行完后,父进程还会继续向下运行,这点与execl函数不同。
2.popen函数
popen的使用:
#include <stdio.h>
FILE *popen(const chat *command, const char *type);
int pclose(FILE *stream);
command:是一个指向以NULL结束的shell命令字符串的指针。
type:只能是读或写的其中一种r/w
无法获得system的值,需要使用popen
代码:
#include <stdio.h>int main()
{char ret[500]={0};FILE *fp;fp = popen("ps","r");int n_read = fread(ret,1,1024,fp);printf("read ret = %d byte\n ret =\n %s\n",n_read,ret);return 0;
}
结果:
当使用system时,ret的值无法读出,用popen函数;