电脑技术学习

UNIX 进程揭秘

dn001

  清单 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 调用返回。这表明正在运行的进程已被新进程所替换。

标签: