进程篇—exec函数族
关键字:exec函数族
首先,我们来看一下什么是exec函数族?
所谓exec函数族,就是以exec开头的函数,比如execl函数、execlp函数等,所以称它为exec函数族。
在exec函数族中,一般是由fork创建子进程后,在子进程中执行,也就是替换子进程中的东西,进程中的空间代码完全被新程序代替,但是调用exec程序不会创建新进程,进程ID也没有发生变化
接下来,我们来看一下函数原型:
我们可以看出来,前面都是exec开头,我们来分别说一下后面几个数字:
l代表的是list:命令行参数列表
p代表的是path:搜索file时的使用的path变量
v代表的是vector:使用命令行参数数组
e代表的是environment:使用环境变量数组
好了,我们看看程序:
结果:
-rwxrwxr-x 1 wz wz 7521 5月 14 12:57 execl
-rw-rw-r-- 1 wz wz 255 5月 14 12:56 execl.c
-rwxrwxr-x 1 wz wz 7484 5月 13 23:55 fork
-rwxrwxr-x 1 wz wz 7526 5月 13 23:34 fork1
-rw-rw-r-- 1 wz wz 348 5月 13 23:34 fork1.c
-rw-rw-r-- 1 wz wz 311 5月 13 20:27 fork.c
-rwxrwxr-x 1 wz wz 7339 5月 1 15:57 practice
-rw-rw-r-- 1 wz wz 88 5月 1 15:57 practice.c
-rwxrwxr-x 1 wz wz 8566 5月 13 10:34 vfork
-rw-rw-r-- 1 wz wz 309 5月 4 14:20 vfork.c
father
由上面的代码可知,这段代码实现的就是在子进程中实现对目录下的文件进行打印,也就是在shell终端命令——ls,其他的函数都是大同小异,就不多说了。接下来,我们自己编一个函数,命名hellow,我们来实验一下:
然后编写execl程序:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 int main()
5 {
6 pid_t pid;
7 pid = fork();
8 if(pid==-1)
9 {
10 perror("error");
11 exit(1);
12 }
13 else if(pid>0)
14 {
15 sleep(1);
16 printf("father\n");
17 }
18 else{
19 // execlp("ls","ls","-l",NULL);
20 execl("/home/wz/code/hello","hello",NULL);
21 }
22 return 0;
23 }
得到的结果是:
hello
hello
father
由此可知,可以进行程序执行,接下来,我们把刚才的ls打印的命令存储在文件中,我们使用的是dup2函数,函数具体使用,可以使用man dup2来查看:
1 #include<unistd.h>
2 #include<stdlib.h>
3 #include<stdio.h>
4 #include<fcntl.h>
5
6 int main()
7 {
8 int fd;
9 fd = open("ls.out",O_WRONLY|O_CREAT|O_TRUNC,0644);
10 if(fd<0)
11 {
12 perror("error");
13 exit(1);
14 }
15 dup2(fd,STDOUT_FILENO);
16 execlp("ls","ls","-l",NULL);
17 return 0;
18 }
结果就是产生一个文件,执行cat ls.out就可以看到和刚才第一个程序的结果是一样的。