int main()
{
...
if(!fork())
{
execvp(cmdName,cmdParam);
}
printf("In main()...");
return(0);
}
答案 0 :(得分:3)
在父进程中,fork
返回子进程的PID,因此您可以将其存储在变量中,然后使用waitpid
等待子进程终止。
不是真的 - fork
创建的新子进程与父进程重复,然后execvp
将其进程映像替换为新映像。实际上,你最初有父母的两份“副本”,其中一份然后“成为”新程序。
答案 1 :(得分:3)
关于你的第一个问题:
像这样使用waitpid(2):
int pid = fork();
if (!pid)
{
execvp(cmdName, cmdParam);
}
waitpid(pid, NULL, 0);
printf("Resuming main()...\n");
对于第二部分:所有exec函数调用都将进行处理(没有一个返回)
答案 2 :(得分:3)
如上所述,您需要保存fork调用的值。你应该在fork上使用多个if。有三种情况:
0:你是父母并且让孩子PID回来了
你真的想知道案例3,它会破坏你的一整天。 (也是执行官的电话)
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); }
答案 3 :(得分:1)
你需要存储fork()
的返回值,它为每个可执行文件返回一个不同的值(如果你是父节点,如果你是子PID,则为0),然后你需要做一个{{1 }}