当进程调用一种exec函数的时候,该进程执行的程序完全替换为新程序。
调用exec并不创建新进程,所以前后的进程ID并未改变。
exec函数一共有以下七种类型:
#include <unistd.h>
int execl(const char *pathname, const char *arg, ...)
int execv(const char *pathname, char *const argv[])
int execle(const char *pathname, const char *arg, ..., char *const envp[])
int execve(const char *pathname, char *const argv[], char *const envp[])
int execlp(const char *filename, const char *arg, ...)
int execvp(const char *filename, char *const argv[])
int fexecve(int fd,char* const argv[],char *const envp[])
以上一个函数的区别如下:
- 查找方式:上表其中前4个函数的查找方式都是完整的文件目录路径(pathname),而最后2个函数(也就是以p结尾的两个函数)可以只给出文件名,系统就会自动从环境变量“$PATH”所指出的路径中进行查找。最后一个函数按照文件描述符查找文件
- 参数传递方式:exec函数族的参数传递有两种方式,一种是逐个列举(l)的方式,而另一种则是将所有参数整体构造成指针数组(v)进行传递。在这里参数传递方式是以函数名的第5位字母来区分的,字母为“l”(list)的表示逐个列举的方式,字母为“v”(vertor)的表示将所有参数整体构造成指针数组传递,然后将该数组的首地址当做参数传给它。
- 环境变量:exec函数族使用了系统默认的环境变量,也可以传入指定的环境变量。这里以“e”(environment)结尾的两个函数execle、execve就可以在envp[]中指定当前进程所使用的环境变量替换掉该进程继承的所以环境变量。
在执行exec之后,进程ID没有改变,但是新程序从调用进程继承了下列属性:
-
进程ID和父进程ID;
-
实际用户ID和实际组ID;
-
附属组ID;
-
进程组ID;
-
会话ID
-
控制终端
-
闹钟尚余留时间
-
当前工作目录
-
根目录
-
文件权限屏蔽字
-
文件锁
-
进程信号屏蔽
-
未处理信号
-
资源限制.
-
友好值
-
tms_utime、tms_stime、tms_cutime以及tms_ustime值
以上内容来源于网络,仅作本人学习笔记使用,关于本书请参考APUE