函数exec(UNIX环境高级编程笔记)

  当进程调用一个exec函数时,该进程执行的程序完全替换成新程序,而新程序从其main函数开始执行。因为调用exec并不创建新进程,所以前后进程的ID并未改变。exec只是用一个磁盘上的新程序替换了当前程序的正文段、数据段、堆段和栈段。
  有7种不同的exec函数可供使用,它们通常被称为exec函数,我们可以使用这7个函数中的任一个。
函数exec(UNIX环境高级编程笔记)_第1张图片

  这些函数之间的第一个区别是前4个函数都是以路径名作为参数,后两个函数则取文件名作为参数,最后一个取文件描述符作为参数。当指定文件名为参数时:
  ● 如果filename中包含 /,则将其视为路径名。
  ● 否则就按PATH环境变量,在它指定的各目录中搜寻可执行文件。
  PATH变量包含了一张目录表(称为路径前缀),目录之间用冒号(:)分割。最后的路径前缀 . 表示当前目录。
  第二个区别与参数表的传递有关(l表示list,v表示vector)。函数execl、execlp和execle要求将新程序的每个命令行参数都说明为一个单独的参数。这种参数表以空指针结尾。对于另外4个函数,则应先构造一个指向各参数的指针数组,然后将该数组的地址作为这4个函数的参数。
  最后一个区别与向新程序传递环境表相关。以e结尾的3个函数可以传递一个指向环境字符串指针数组的指针。其他4个函数则使用调用进程中的environ变量作为新程序复制现有的环境。
  这7个函数中,字母p表示该函数取pathname作为参数,并且用PATH环境变量寻找可执行文件。字母l表示该函数读取一个参数表,它与字母v互斥。v表示该函数取一个argv[]矢量。最后,字母e表示该函数取envp[]数组,而不使用当前环境变量。
  每个系统对参数表和环境表的总长度都有一个限制。为了摆脱对参数表长度的限制,我们可以使用xargs(1)命令,将长参数表断开成几个部分。
  新进程从调用进程继承了下列属性:
  ● 进程ID和父进程ID
  ● 实际用户ID和实际组ID
  ● 附属组ID
  ● 进程组ID
  ● 会话ID
  ● 控制终端
  ● 闹钟尚余留的时间
  ● 当前工作目录
  ● 根目录
  ● 文件模式创建屏蔽字
  ● 文件锁
  ● 进程信号屏蔽
  ● 未处理信号
  ● 资源限制
  ● nice值
  ● tms_utime、tms_stime、tms_ctime以及tms_cstime值
  在很多UNIX实现中,这7个函数中只有execve是内核的系统调用。另外6个只是库函数,它们最终都要调用系统调用。这7个函数之间的关系如图所示:
函数exec(UNIX环境高级编程笔记)_第2张图片

你可能感兴趣的:(UNIX环境高级编程,linux)