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.文件锁

posted on 2014-11-21 10:24  大漠石头  阅读(107)  评论(0)    收藏  举报