fork()函数生成的子进程只能运行与父进程相同的代码函数,如果想要子进程执行另外一个程序,需要用到exec族的函数,如下:
execlp()函数
int execlp(const char *file,const char *arg,…);
/***execlp.c***/#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ pID_t pID; pID = fork(); if(-1 == pID) { perror("fork error:"); exit(1); } else if(0 < pID) { sleep(2); printf("parent\n"); } else { execlp("ls","ls","-l","-a",NulL); } return 0;}
运行结果:
[email protected]:~/wangqinghe/linux/20190806$ ./execlp
总用量 28
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月 6 13:19 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 274 8月 6 13:19 execlp.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 37 8月 6 13:10 test.c
parent
execl()函数
execl()函数第一个参数跟的是程序路径地址
int execl(const char *path,const char*arg,…);
/***execl.c***/#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ pID_t pID; pID = fork(); if(-1 == pID) { perror("fork error:"); exit(1); } else if(0 < pID) { sleep(2); printf("parent\n"); } else { execlp("/bin/ls",NulL); } return 0;}
运行结果:
[email protected]:~/wangqinghe/linux/20190806$ gcc execl.c -o execl
[email protected]:~/wangqinghe/linux/20190806$ ./execl
总用量 44
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4096 8月 6 13:23 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4096 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:23 execl
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 280 8月 6 13:23 execl.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8856 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 275 8月 6 13:21 execlp.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 37 8月 6 13:10 test.c
parent
该函数可以执行自定义函数:
/*** *test.c**/#include<stdio.h>#include<unistd.h>int main(){ printf("This is a test\n"); sleep(1); return 0; }/***execl.c***/#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ pID_t pID; pID = fork(); if(-1 == pID) { perror("fork error:"); exit(1); } else if(0 < pID) { sleep(2); printf("parent\n"); } else { execlp("./test","test",NulL); } return 0;}
运行结果:
@L_419_3@:~/wangqinghe/linux/20190806$ ./execl
This is a test
parent
execv()函数
int execv(const char * file,char *const argv[]);
/***execv.c***/#include<stdio.h>#include<stdlib.h>#include<unistd.h>int main(){ pID_t pID; pID = fork(); if(-1 == pID) { perror("fork error:"); exit(1); } else if(0 < pID) { sleep(2); printf("parent\n"); } else { char *argv[] = {"ls","-a","-h",NulL}; execv("/bin/ls",argv); } return 0;}
运行结果:
[email protected]:~/wangqinghe/linux/20190806$ gcc execv.c -o execv
[email protected]:~/wangqinghe/linux/20190806$ ./execv
总用量 76K
drwxrwxr-x 2 ubuntu1604 ubuntu1604 4.0K 8月 6 13:43 .
drwxrwxr-x 3 ubuntu1604 ubuntu1604 4.0K 8月 6 13:06 ..
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月 6 13:34 execl
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 271 8月 6 13:34 execl.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.7K 8月 6 13:19 execlp
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 275 8月 6 13:21 execlp.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.8K 8月 6 13:43 execv
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 343 8月 6 13:42 execv.c
-rwxrwxr-x 1 ubuntu1604 ubuntu1604 8.5K 8月 6 13:32 test
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 106 8月 6 13:34 test.c
-rw-rw-r-- 1 ubuntu1604 ubuntu1604 55 8月 6 13:28 while.c
parent
总结以上是内存溢出为你收集整理的exec族函数全部内容,希望文章能够帮你解决exec族函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)