exec函数的一些问题

当进程调用exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的代码段、数据段、堆和栈。

 1 #include <unistd.h>
 2 
 3 //若出错则返回-1,若成功则不返回值
 4 
 5 int execl(const char *pathname,const char *arg0,.../*(char*)0*/);
 6 
 7 int execv(const char *pathname,char *const argv[]);
 8 
 9 int execle(const char *pathname,const char *arg0,...
10 /*(char*)0,char *const envp[]*/);
11 
12 int execve(const char *pathname,char *const argv[],char *const envp[]);
13 
14 int execlp(const char *filename,const char *arg0,.../*(char*)0*/);
15 
16 int execvp(const char *filename,char *const argv[]);

这些函数的第一个区别是前四个取路径名作为参数,后两个则取文件名作为参数,当指定filename作为参数时:

1、如果filename中包含/,则将其视为路径名

2、否则就按PATH环境变量,在它所指定的各目录中搜寻可执行文件

第二个区别与参数表的传递有关(l表示list,v表示vector)。execl、execle、execlp要求将新程序的每个命令行参数都说明为一个单独的参数,这种参数表以空指针结尾。对于execv、execve、execvp,则应先构造一个指向各参数的指针数组,然后将该数组地址作为这三个函数的参数。

最后一个区别与向新程序传递环境表相关。execle和execve可以传递一个指向环境字符串指针数组的指针。其他四个函数则使用调用进程中的environ变量为新程序复制现有的环境。

 

在执行exec前后实际用户ID和实际组ID保持不变,而有效ID是否改变则取决于所执行程序文件的设置用户ID位和设置组ID位是否设置。如果新程序的设置用户ID位已设置,则有效用户ID变成程序文件所有者的ID,否则有效用户ID不变。

posted @ 2012-07-04 16:48  Cavia  阅读(269)  评论(0编辑  收藏  举报