您的位置:首页 > 其它

exec()&fork()配合使用运行不同的进程

2009-05-26 10:23 253 查看
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[] = { "/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 called/n");
}
printf("Execution continues in parent process/n");
}
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


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

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

还存在其他执行 (
exec
) 某个进程的系统调用,它们的区别在于接受参数的方式和是否需要传递环境变量。
execv(2)
是替换当前映像的较简单方法之一,因为它不需要关于环境的信息,并且它使用以 Null 结尾的数组。其他选项包括
execl(2)
(它单独接受各个参数)或
execvp(2)
(它也接受一个以 Null 结尾的环境变量数组)。使问题复杂化的是,并非所有操作系统都支持所有变体。关于使用哪一种变体的决定取决于平台、编码风格和是否需要定义任何环境变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐