1.system
- #include
-
- int system(const char *command);
返回值:
成功,则返回进程的状态值;不能源码execl函数,返回127;失败返回-1;
不能成功运行分析文章:linux下system函数详解_linux system_遥_望的博客-CSDN博客
在linux系统下,system函数是execl函数的封装版
popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:成功 /失败
源码:
- #include
- #include
- #include
- #include
-
- 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;
- }
在linux系统下,system函数是execl函数的封装版
文中的 "sh -c ps"
和我们所使用的"ps"
是完全等价的
例子代码:
- #include
- #include
- int main()
- {
- system("ps");
- printf("\n");
- }
直接运行ps指令;
运行文件:
- #include
- int main(int argc,char *argv[])
- {
- int i;
- for(i=0;i
- printf("argv[%d]:%s\n",i,argv[i]);
- }
- return 0;
- }
system运行:
- #include
- #include
- 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
- #include
- #include
- #include
- #include
- #include
- #include
-
- 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,替换为5
- char *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
- #include
- #include
- #include
- #include
- #include
- #include
-
- 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
FILE *popen(const chat *command, const char *type);
int pclose(FILE *stream);
command:是一个指向以NULL结束的shell命令字符串的指针。
type:只能是读或写的其中一种r/w
无法获得system的值,需要使用popen
代码:
- #include
-
-
- 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函数;