8.5 exec 函数


   exec 函数并不创建任何新进程,所以前后进程关系是没有发生任何改变,exec 所做的就是替换当前正文段、数据、堆和栈。 exec 族函数包括:

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

   exec 如果传入的是 filename,那么:

  • 如果包含 /,那么认为这是一个路径名 pathname
  • 否则在 PATH 环境变量里查找到第一个可执行文件
  • 如果可执行文件不是链接器产生的,那么认为是一个 shell 文件,使用 /bin/sh 执行

   执行 exec 函数,下面属性是不发生变化的:

  • 进程 ID 和父进程 ID
  • 实际用户 ID 和实际组 ID
  • 附加组 ID
  • 会话 ID
  • 控制终端
  • 闹钟余留时间
  • 当前工作目录
  • 根目录
  • umask
  • 文件锁
  • 进程信号屏蔽
  • 未处理信号
  • 资源限制
  • 进程时间

   而下面属性是发生变化的:

  • 文件描述符如果存在 close-on-exec 标记,那么会关闭
  • 可执行程序存在设置用户 ID 和组 ID 位,那么有效用户 ID 和组 ID 会发生变化