8.10 进程控制_exec函数

 

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

      用fork可以创建新进程,用exec可以执行新程序,exit函数和两个wait函数处理终止和等待终止。这些是我们需要的基本的进程控制原语。

  • #include <unistd.h>
  • 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 []);

      以上函数之间的第一个区别是前4个取路径名作为参数,后两个则取文件名作为参数。当指定filename作为参数时:

  • 如果filename中包含/,则将其视为路径名。
  • 否则就按PATH环境变量,在它所指定的各目录中搜寻可执行文件。

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

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

      字母p表示该函数取filename作为参数,并且用PATH环境变量寻找可执行文件。字母l表示该函数取一个参数表,它与字母v互斥。v表示该函数取一个argv[]矢量。最后,字母e表示该函数取envp[]数组,而不使用当前环境。

      在执行exec后,进程ID没有改变。除此之外,执行新程序的进程还保持了原进程的下列特征:

  • 进程ID和父进程ID。
  • 实际用户ID和实际组ID。
  • 附加组ID。
  • 进程组ID。
  • 会话ID。
  • 控制终端。
  • 闹钟尚余留的时间。
  • 当前工作目录。
  • 根目录。
  • 文件模式创建屏蔽字。
  • 文件锁。
  • 进程信号屏蔽。
  • 未处理信号。
  • 资源限制。
  • tms_utime、tms_stime、tms_cutime以及tms_cstime值。

      对打开文件的处理与每个描述符的执行时关闭(close-on-exec)标志值有关。进程中每个打开描述符都有一个执行时关闭标志。若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。除非特地用fcntl设置了该标志,否则系统的默认操作是在执行exec后仍保持这种描述符打开。

      POXIX.1明确要求在执行exec时关闭打开的目录流。这通常是有opendir函数实现的,它调用fcntl函数为对应于打开目录流的描述符设置执行时关闭标志。

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

      这6个函数中只有execve是内核的系统调用。另外的5个只是库函数,它们最终都要调用该系统调用。

 

图8.4 6个exec函数之间的关系

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值