清单 4. 通过将 fork 与 exec 配合使用来运行不同的程序
sunbox$ cat exec1.c
#include <unistd.h>
#include <stdio.h>
int main (void) {
/* Define a null terminated array of the command to run
followed by any parameters, in this case none */
char *arg[] = { "/usr/bin/ls", 0 };
/* fork, and exec within child process */
if (fork() == 0) {
printf("In child process:n");
execv(arg[0], arg);
printf("I will never be calledn");
}
printf("Execution continues in parent processn");
}
sunbox$ gcc exec1.c -o exec1
sunbox$ ./exec1
In child process:
fork1.c exec1 fork2 exec1.c fork1
fork2.c
Execution continues in parent process
清单 4 中的代码首先定义一个数组,其中第一个元素是要执行的二进制文件的路径,其余元素充当命令行参数。根据手册页的描述,该数组以 Null 结尾。在从 fork 系统调用返回以后,将指示子进程执行 (execv) 新的二进制文件。
execv 调用首先取得一个指向要运行的二进制文件名称的指针,然后取得一个指向您前面声明的参数数组的指针。该数组的第一个元素实际上是二进制文件的名称,因此参数实际上是从第二个元素开始的。请注意,该子进程一直没有从 execv 调用返回。这表明正在运行的进程已被新进程所替换。
标签: