4. 执行另一个程序:exec系列函数
子进程经常要调用exec函数执行另一个程序,进程ID不变,exec系列函数有7种:
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ...);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, ..., char *const envp[]);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ...);
int execvp(const char *filename, char *const argv[]);
int fexecve(int fd, char *const argv[], char *const envp[]);
出错返回-1,成功则不返回。
区别说明:
(1). 程序参数传递:l表示list,函数名带l的函数每个命令行参数都为一个单独的参数,最后NULL结尾;
v表示vector,函数名带v的函数先将参数构造为一个指针数组,再将该数组的地址作为参数;
一般来说,新程序中的argv[0]设置为路径名的文件名分量。
(2). 如何找到可执行程序:
函数名带p,用文件名寻找:filename中有/,则相当于路径名;没有/,则从环境变量PATH包含的目录中寻找该程序文件;
函数名不带p,则通过路径名寻找;
fexecve使用文件描述符为参数,调用进程使用文件描述符验证所需要的文件并无竞争的执行该文件;
(3). 是否传递环境表:
以e结尾的函数可以传递一个指向环境字符串指针数组的指针。
(4). 相互关系:
execve是内核的系统调用,其余是库函数,最终都要调用该系统调用。