【问题标题】:Can a parent process determine if its child has received a SIGINT?父进程能否确定其子进程是否收到了 SIGINT?
【发布时间】:2024-05-02 12:30:02
【问题描述】:

假设我启动了一个父进程,它启动了一个子进程,但随后父进程收到了SIGINT。我希望父进程退出,但我不希望子进程徘徊和/或成为僵尸。我需要确保它死掉。

如果我可以确定孩子也收到了SIGINT,那么它可能正在自行清理。在这种情况下,我宁愿在它完成并自行退出时短暂等待。但如果它没有收到SIGINT,那么我会立即给它发送SIGTERM(或SIGKILL),让父进程自己进行清理。

如何确定孩子是否收到了SIGINT? (撇开它甚至可能不响应SIGINT...的事实不谈)我是否只需要猜测,基于父进程是否在前台进程组中运行?如果SIGINT 是以编程方式发送的,而不是通过Ctrl+C 发送呢?

【问题讨论】:

  • SIGINT 是如何完成的? Ctrl-C 一般给进程组....
  • 不清楚的问题。给minimal reproducible example
  • 相关问题(由同一 OP 提出):*.com/q/47224241/841108
  • 不,除非说 SIGINT 直接杀死孩子,在这种情况下,父母将获得 SIGCHLD 并且父母将能够通过waitpid 为孩子接收的状态将表明孩子被杀死信号情报。另外,如果父母死了,孩子也不会变成僵尸。如果一个孩子死了并且它的父母没有获得它的状态信息,它就会变成一个僵尸

标签: unix subprocess signals


【解决方案1】:

如何确定孩子是否收到了 SIGINT?

也许你不能。如果孩子 处理 SIGINT(它本可以忽略它),那么对您来说应该很重要。对于您的其他问题,请参阅 my answer

但是,在许多情况下,Ctrl C 发送的信号被发送到进程组。那么你可能也收到了那个信号。

在病态的情况下,您的整个系统都在试验thrashing,甚至还没有安排子进程来处理信号。

我希望父进程退出,但我不希望子进程逗留和/或变成僵尸。我需要确保它死掉。

也许你想在某个地方使用daemon(3)

顺便说一句,我不明白你的问题,因为我必须猜测它的(未知)动机。您是否关心作业控制或实施外壳?在哪些具体情况下,您真正​​关心孩子收到SIGINT,这对您意味着什么?

【讨论】: