【发布时间】:2018-11-15 08:21:57
【问题描述】:
我是 C 的初学者,我正在努力理解 C 中的 execve 函数来调用子进程来加载和运行可执行对象文件。
我们知道execve只有在出现找不到文件名之类的错误时才会返回调用程序,所以它只被调用一次,永远不会返回。
这是我的问题,如果我们 fork 一个子进程来调用 execve 但由于 execve 永远不会返回,如果一切正常,它将始终执行某些操作,这意味着子进程永远不会终止,所以父进程如何获得这个子进程?下面是示例代码
if ((pid = Fork()) == 0) { /* Child runs user job */
if (execve(argv[0], argv, environ) < 0) { -------->line 2
printf("%s: Command not found.\n", argv[0]);
exit(0);
}
}
/* Parent waits for foreground job to terminate */
if (waitpid(pid, &status, 0) < 0) { ------------> but the child process never terminated
printf("waitpid error");
}
所以在第 2 行,execve(argv[0], argv, environ) 永远不会返回,所以子进程永远不会终止?
【问题讨论】:
-
当您加载的程序终止子进程时(通过从其
main函数返回或通过调用exit),子进程将被终止。就像任何其他过程一样。 -
@Someprogrammerdude 谢谢你,现在我明白了。但为什么 execve 设计为永不返回?我们不能设计成这样:如果子进程终止,则返回 1?
-
为此您必须询问 UNIX 的原始设计者。至于知道子进程何时终止(并可能获得其返回码),请使用例如
wait. -
@amjad 如果子进程终止,它不能返回 1,因为它是子进程。一旦
exec成功,你的代码就不再运行,也没有什么可返回的。