经过前几章的了解我们对进程的创建和结束有了了解。
那么我们知道fork函数创建的进程只是将父进程的环境复制到新进程中,而没有用新程序来初始化创建的子进程,因此,它并不能执行一个新的目标程序,而这一点又是程序设计时所必须的,为此linux系统提供了exec系统调用。
exec函数有6种不同的使用格式,但是内核中只对应一个入口,不同之处在于不同格式有不同的名字和调用函数,这6种调用在头文件unistd.h中,格式如下:
int execl (const char *__path, const char *__arg, ...)
int execv (const char *__path, char *const __argv[])
int execle (const char *__path, const char *__arg, ...)
int execve (const char *__path, char *const __argv[], char *const __envp[])
int execlp (const char *__file, const char *__arg, ...)
int execvp (const char *__file, char *const __argv[])
上面的参数path指出一个可执行目标文件的路径名,参数file指出可执行目标文件的文件名,arg作为约定,同path一样指出目标文件的路径名,参数argv是一个字符指针数组,由它指出该目标程序使用的命令行参数表,按约定第一个字符指针指向与path或file相同的字符串,最后一个envp与argv一样也是一个字符指针数组,由它指出该目标程序执行是的进程环境,它也以一个空指针结束。
调用成功时exec不返回,从而不执行exec以后的所有语句,失败时返回-1;
exec的6种格式在以下3点上有所不同:
1、 path是一个目标文件的完整路径名,而file是目标文件名,它可以通过环境变量path来搜索;
2、 有path或file指定的目标文件的命令行参数是完整的参数列表还是通过指针数组argv来给出的;
3、 环境变量是系统自动传递还是通过envp传递的;
下表说明了exec函数的6种不同格式对以上3点的支持
接下来我们来看一个简单的例子,来简单的使用下exec函数:
然后我们再将上图中的12行的execl换成execlp,会打印出什么呢?
可以看到exec调用成功了,由此可见execl和execlp这两个函数可以替换使用,但需注意的是execlp中指定的目标文件名必须在path所定义的某个路径名之下。