进程篇—exec函数族
关键字:exec函数族
首先,我们来看一下什么是exec函数族? 
所谓exec函数族,就是以exec开头的函数,比如execl函数、execlp函数等,所以称它为exec函数族。 
在exec函数族中,一般是由fork创建子进程后,在子进程中执行,也就是替换子进程中的东西,进程中的空间代码完全被新程序代替,但是调用exec程序不会创建新进程,进程ID也没有发生变化 
接下来,我们来看一下函数原型:

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);

我们可以看出来,前面都是exec开头,我们来分别说一下后面几个数字: 

l代表的是list:命令行参数列表 
p代表的是path:搜索file时的使用的path变量 
v代表的是vector:使用命令行参数数组 
e代表的是environment:使用环境变量数组 

好了,我们看看程序:

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 }
21 return 0;
22 }

结果:

-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,我们来实验一下:

1 #include<stdio.h>                                                           
2 int main()
3 {
4 printf("hello\n");
5 printf("hello\n");
6 return 0;
7 }

然后编写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就可以看到和刚才第一个程序的结果是一样的。