C - 原子 killpg

C - Atomic killpg

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

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

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

我怎样才能做到这一点?

你的意思是所有 child 进程必须在故障 child 发送 SIGUSR1 后立即停止工作吗?

如果这是你想要的,我认为你无法按照你的方式实现:当有故障的 child 将 SIGUSR1 发送给领导者时,其他 childs 将继续执行直到 SIGUSR1由leader处理。

你真的需要有故障的进程先将 SIGUSR1 发送给领导者吗?难道有问题的进程直接向组发送SIGUSR2,这个信号可以被领导者忽略(或者,至少,不作为终止信号处理)?

信号以异步方式传递,因为 parent 和 child 进程都是 运行ning,您不能指望 child 进程会立即处理信号当parent发送信号时。

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 将 SIGUSR1 发送到 parent 时,它们会停止工作,并通过等待函数等待 SIGUSR2 信号,例如 sigtimedwait,或 sigwait,这样,他们在退出前就不会运行任何额外的代码。

  2. 使用pipesocketpair在parent和children之间建立沟通渠道,即parent发送kill指令 children,每个 child 将释放必要的资源并自杀。这需要 children 在工作时收听频道。