Linux进程控制函数之exec()系列函数
转自: http://blog.sina.com.cn/s/blog_590be5290100r4ge.html 感谢原作者
#include <unistd.h>
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 execve(const char *path, char *const argv[], char *const envp[]);
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
当进程调用一种exec()函数时,该进程执行的程序完全替换为新程序,而新程序则从main函数开始执行。因为调用exec()并不创建新进程,所以前后的进程ID不变。函数exec()只是用一个全新的程序替换当前进程的正文、数据、堆和栈段。
【说明】
(1)事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve。
(2)调用exec并不创建新进程。一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号。也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。(不过exec类函数中有的还允许继承环境变量之类的信息。)
(3)这些函数如果调用成功,则加载新的程序从启动代码开始执行,不再返回;如果调用出错则返回-1。所以,exec 函数只有出错的返回值,而没有成功的返回值。
(4)只有fork()或vfork()函数才能创建一个新进程,而exec()函数是不能创建进程的。因此在使用exec()函数之前,先要使用fork()或vfork()创建子进程,然后子进程调用exec()函数来执行另外一个程序。
(5)不带p的表示第一个变量必须指定程序路径,带p的表示在PATH环境变量的目录列表中搜索。
带有l(表示list)的exec 函数要求将新程序的每个命令行参数都当作一个参数传给它,命令行参数的个数是可变的,因此函数原型中有... ,... 中的最后一个可变参数应该是NULL。
带有v(表示vector)的函数,则应该先构造一个指向各参数的指针数组,然后将该数组的首地址当作参数传给它,数组中的最后一个指针也应该是NULL。
以e(表示environment)结尾的exec 函数,可以把一份新的环境变量表传给它,其他exec 函数仍使用当前的环境变量表执行新程序。
(6)执行exec()函数后的进程除了保持了原来的进程ID,父进程ID,实际用户ID和实际组ID之外,进程还保持了其他许多原有特征,主要有:
a.当前工作目录
b.根目录
c.创建文件时使用的屏蔽字
d.进程信号屏蔽字。
e. 未决警告
f.和进程相关的使用处理器的时间
g.控制终端
h.文件锁
浙公网安备 33010602011771号