gpt4 book ai didi

C - 原子 killpg

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:09 28 4
gpt4 key购买 nike

我有很多 fork 的过程。子进程做很多事情和另一个系统调用。
当任何子进程从系统调用中获取错误时,它会将错误描述打印到 stderr 并将 SIGUSR1 发送到组长(主要父进程)。
SIGUSR1 告诉父进程杀死所有子进程,释放资源并退出程序执行(以避免僵尸进程)。

我需要一次杀死所有的 child 。原子地。因此,当任何子进程发生任何错误时,所有子进程都会立即停止工作。
当前父进程使用 SIGUSR2 杀死所有子进程 - 它向所有进程组成员发送此信号 (killpg) - 他们都安装了信号处理程序来杀死它们(退出) - 组长不会得到虽然被杀死了(它仍然需要释放资源)。

问题是在所有子进程被杀死之前,它们仍然可以执行大约 1-2 行代码,这不是我想要的。我需要立即阻止他们。

我怎样才能做到这一点?

最佳答案

信号以异步方式传递,因为父进程和子进程都在运行,您不能期望子进程会在父进程发送信号时立即处理信号。

The problem is that before all child processes get killed, they still can execute about 1-2 rows of code, which is not what I want. I need to stop them immediately.

您的问题更多是进程之间的协调和同步,而不是信号句柄。我能想到的有两种方法:

  1. 使用同步信号。也就是说,当每个 child 向 parent 发送 SIGUSR1 时,他们停止工作,并通过等待函数等待 SIGUSR2 信号,如 sigtimedwait,或者sigwait,这样,他们在退出前不会运行任何额外的代码。

  2. 使用pipesocketpair创建parent与child之间的通信 channel ,即parent向child发送kill指令,每个child释放必要的资源并自杀。这就需要 child 边做作业边听 channel 。

关于C - 原子 killpg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705762/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com