考虑在Solaris 11.3(系统(3C)的简化版本)下运行的以下代码:
int main(int argc, char **argv) {
pid_t pid = fork();
pid_t w;
int status;
if (pid == 0) {
execvp(argv[1], argv + 1);
perror("Failed to exec");
exit(127);
}
if (pid > 0) {
w = waitpid(pid, &status, 0);
if (w == -1) {
perror("Wait: ");
exit(1);
}
else if (WIFEXITED(status) > 0) {
printf("\nFinish code: %d\n", WEXITSTATUS(status));
}
else {
printf("\nUnexpected termination of child process.\n");
}
}
if (pid == -1) {
perror("Failed to fork");
}
}
我得到的问题是,只要通过信号(例如,SIGINT)完成过程,就不会打印“意外终止”消息。
我看到它的方式,整个进程组从终端接收信号,在这种情况下,父进程只是在waitpid(2)返回之前终止(显然每次都会发生这种情况)。
如果是这种情况,我有一个后续问题。如何在不使用信号处理程序的情况下从父级检索有关终止子进程的信号的信息?例如,我可以添加另一个if-else块,其中WIFSIGNALED
检查和WTERMSIG
调用传递变量status
(事实上,我做了,但是在用Ctrl + C终止时该计划没有提供任何输出)
那究竟是什么以及以何种顺序发生的?
答案 0 :(得分:3)
你说,“...每当过程通过信号完成时
(例如,SIGINT)......“,但你不够具体
让任何人明确回答你的问题。
如果要使用kill
命令向子进程发送信号,
你有一个奇怪的问题。
但是,如果我怀疑(正如你所说的那样)
“整个过程组接收来自终端的信号”,
你只是输入 Ctrl + C ,这很简单:
相关的U& L问题:
答案 1 :(得分:1)
如果您通过另一个tty的“kill”发送信号,它是否正常工作?我在linux上试过这个。似乎行为相同。
如果将shell控制信号传递给进程组,我认为你是对的....你有一场比赛。您需要在父母中捕获并延迟它们。
我所做的就是做“./prog cat”
执行kill -SIGINT 工作正常。
执行control-C不打印任何内容。
在前面做一个setsid()有父终止,但是孩子继续运行。