2

我有一个任务,我必须创建一个能够做很多事情的迷你外壳,包括工作控制。我设法使用 fork 和 execvp 创建了新工作。但我也想获得由 execvp 运行的程序的退出代码。根据我从其他帖子中查找的内容,我可以使用if(WIFEXITED(status)).

但是,如果用户在 shell 中输入带有进程名称的“&”,我们也需要在后台运行进程。因此,等待父进程等待子程序在后台完成是没有意义的。是否可以设置任何中断来通知父进程子进程已结束?然后我可以使用该if(WIFEXITED(status))语句来获取退出代码。

例子

sleep 100 &

将在后台运行,而我可以同时在前台执行其他 shell 命令。

4

1 回答 1

3

如果您不做任何特别的事情,父母会SIGCHLD在孩子去世时收到一个。不过要小心,多个孩子可以同时终止,你会得到一个信号。处理此问题的正确方法是循环(在信号处理程序中):

while (waitpid(-1, NULL, WNOHANG) > 0)
    /* Stuff. */
于 2012-11-10T07:25:08.160 回答