(进程学习二)使用 exec 系列系统调用

继续上一篇内容(进程学习一 使用 fork 系统调用)的学习:

现在您已经了解了复制某个进程的方法,下面让我们研究如何运行一个不同的进程。fork 只是进程机制中的一半。exec 系列系统调用运行实际的程序。

清单 4. 通过将 fork 与 exec 配合使用来运行不同的程序

清单4 中的代码首先定义一个数组,其中第一个元素是要执行的二进制文件的路径,其余元素充当命令行参数。根据手册页的描述,该数组以 Null 结尾。在从 fork 系统调用返回以后,将指示子进程执行 (execv) 新的二进制文件。

execv 调用首先取得一个指向要运行的二进制文件名称的指针,然后取得一个指向您前面声明的参数数组的指针。该数组的第一个元素实际上是二进制文件的名称,因此参数实际上是从第二个元素开始的。请注意,该子进程一直没有从 execv 调用返回。这表明正在运行的进程已被新进程所替换。

还存在其他执行 (exec) 某个进程的系统调用,它们的区别在于接受参数的方式和是否需要传递环境变量。execv(2) 是替换当前映像的较简单方法之一,因为它不需要关于环境的信息,并且它使用以 Null 结尾的数组。其他选项包括 execl(2)(它单独接受各个参数)或 execvp(2)(它也接受一个以 Null 结尾的环境变量数组)。使问题复杂化的是,并非所有操作系统都支持所有变体。关于使用哪一种变体的决定取决于平台、编码风格和是否需要定义任何环境变量。

(未完待续)

发表评论

电子邮件地址不会被公开。 必填项已用*标注