int main()
{
...
if(!fork())
{
execvp(cmdName,cmdParam);
}
printf("In main()...");
return(0);
}
- 假设我已经正确传递了 cmdName 和 cmdParam 参数,我该如何等待 execvp 创建的进程完成,然后再继续执行 main()?
- execvp() 是否创建了一个作为新 fork() 进程的子进程的进程?
如前所述,您需要保存 fork 调用的值。你真的应该在叉子上使用更多的 if 。有以下三种情况:
0:你是父母并得到了一个孩子的PID
你真的很想知道案例3,它会毁了你一整天。(也是 exec 调用)
int main() {
int pid = fork();
if(-1 == pid) {
fprintf(stderr, "Big problems forking %s\n", strerror(errno);
exit(-1);//or whatever
}
else if (0 == pid) {
if (-1 == execvp(cmdName,cmdParam)) {
//like above, get some output about what happened
}
}
//no need to else here, execvp shouldn't return
// if it does you've taken care of it above
waitpid(pid, NULL, 0);
printf("Resuming main()...");
}
返回(0);}
在父进程中,fork
返回子进程的PID,所以你可以将它存储在一个变量中,然后waitpid
用来等待子进程终止。
并非如此 - 创建的新子进程fork
是父进程的副本,execvp
然后将其进程映像替换为新映像。实际上,您最初有两个父程序的“副本”,然后其中一个“成为”新程序。
对于你的第一个问题:
像这样使用 waitpid(2):
int pid = fork();
if (!pid)
{
execvp(cmdName, cmdParam);
}
waitpid(pid, NULL, 0);
printf("Resuming main()...\n");
对于第二部分:所有 exec 函数调用都接管了进程(它们都不返回)
您需要存储 的返回值fork()
,它为每个可执行文件返回不同的值(如果您是子 PID,则为 0,如果您是父级),然后您需要执行waitpid