【发布时间】:2012-11-09 01:32:09
【问题描述】:
我需要能够:
- fork 一个进程并使其成为 execvp(我这样做了)
- 检查子进程execvp是否成功(不知道如何)
- 检查子进程是否完成(有问题)
我正在分叉一个进程,但我无法检查孩子的 execvp 是否有效。如果它失败了,我需要能够知道它失败了。目前我正在使用
-1 != waitpid( pid, &status, WNOHANG )
但似乎如果pid进程的execv失败,waitpid不会返回-1。
我该如何检查呢?我阅读了 waitpid 手册页,但我不清楚;也许我的英语不够好。
编辑:为了解释更多:
我正在为家庭作业构建自己的终端。我需要输入一个命令字符串,比如说“ls”,然后我必须执行命令。
孩子分叉后,孩子调用execvp来执行命令(在我解析字符串之后),父母需要检查命令末尾是否有'&'。
如果命令末尾不存在符号“&”,则父级需要等待子级执行。
所以我需要知道 execvp 是否失败。如果它没有失败,那么父母使用 waitpid 等待孩子完成它的执行。如果失败,则父母不会等待孩子。
【问题讨论】:
-
有史以来最好的问题标题。
-
这里有几个因素可能会影响您的解决方案:您
execvping 您的流程是什么?你有能力编辑那个吗?在孩子退出之前不知道 execvp 是否失败可以吗?如果您发布更详细的问题陈述,我们或许可以提供更好的建议。 -
如果发生上述故障,您不能从孩子向父母发送信号吗?
-
在这种情况下,您实际上不需要知道 execvp 是否成功。您需要做的就是决定是否将
WNOHANG用于waitpid。如果有 &,则使用它。否则,使用一些结构来监控后台任务。 -
实际上,看看我给stackoverflow.com/questions/12824848/… 的答案——它提供了相当不错的代码解决方案。