子进程的执行 -- exec 函数

2014-08-06 05:45:11   最后更新: 2014-08-06 05:45:11   访问数量:1374




fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序,当进程调用一种 exec 函数时,该进程执行的程序完全替换为新程序,而新程序则从其 main 函数开始执行,但是 exec 函数并不创建新进程,因此调用前后的进程 ID 并不发生改变,exec 只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段

 

有6种不同的 exec 函数可供使用:

int execl (const char *pathname, const char *arg0, ... /* (char *)0 */ ); int execv (const char *pathname, char *const argv[] ); int execle (const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[] */ ); int execve (const char *pathname, char *const argv[] , char *const envp[] ); int execlp (const char *filename, const char *arg0, ... /* (char *)0 */ ); int execvp (const char *filename, char *const argv[] );

 

六个函数都定义于 <unistd.h> 头文件中,若出错返回-1,若成功则没有返回值

 

存放在硬盘上的可执行程序文件被执行的唯一方法就是由一个现有进程调用上述六个 exec 函数中的某一个

 

六个函数的区别在于

  • 前四个以路径名作为参数,后两个以文件名为参数,如果 filename 中包含 /,则将其视为路径名,否则在 PATH 环境变量所指示的目录中搜寻相应的可执行文件,filename 所指示的文件也可以是一个 shell 脚本,系统会调用 /bin/sh 执行他
  • 六个函数中有 l 的表示 list,即使用参数列表传递所有的参数,以空指针结束,但是需要注意的是,最后的空指针如果以0为参数,则必须进行强制转换,否则会被编译器认为是常数0而不是用来标志列表结束的空指针,而函数中有 v 的表示 vector 即使用二维字符数组传递所有的参数
  • 以 e 结尾的两个函数可以传递一个指向环境字符串指针数组的指针,其他四个函数则使用调用进程中的 environ 变量为新程序复制现有的环境变量,如果系统支持 setenv 和 putenv 则可以更改当前环境和后面生成的子进程的环境,但是不能影响父进程的环境

 

下图展示了六个函数之间的区别:

 

 

执行新程序的进程保持了原进程的下列特征:

  1. 进程ID和父进程ID
  2. 实际用户ID和组用户ID
  3. 附加组用户ID
  4. 进程组ID
  5. 会话ID
  6. 控制终端
  7. 闹钟尚余留时间
  8. 当前工作目录
  9. 根目录
  10. 文件模式创建屏蔽字
  11. 文件锁
  12. 进程信号屏蔽
  13. 未处理的信号
  14. 资源限制
  15. tms_utime、tms_stime、tms_cutime以及tms_cstime等值

 

对打开文件的处理与每个描述符的执行时关闭(close-on-exec)标志值有关,进程中每个打开描述符都有一个执行时关闭标志(FD_CLOEXEC),若此标志设置,则在执行 exec 时关闭描述符,否则该描述符仍然打开,系统默认操作是在执行 exec 后仍保持该描述符打开,但是我们可以通过使用 fcntl 函数设置该描述符,具体可以参见:

进程间文件共享fcntl函数 -- 功能强大的文件状态操作函数

 

在执行 exec 后,实际用户ID和实际组ID都保持不变,但是有效ID是否改变则取决于所执行程序文件的设置用户ID和设置组ID位是否设置,如果新程序的设置用户ID位已经设置,则有效用户ID编程程序文件所有者ID,否则有效用户ID不变,对组ID的处理方式与此相同

6个函数中只有 execve 函数是系统调用,其他函数只是库函数,他们的调用关系如下图所示:

 

 






读书笔记      技术帖      linux      unix      c语言      龙潭书斋      apue      unix环境高级编程      exec      execl      execv      execle      execve      execlp      execvp     


京ICP备15018585号