我有一个看起来像这样的流程链 P0(主进程)创建P1,然后P1创建P2,依此类推...
当 Pn 创建时(n 是一个随机数 ~ 10),除 P0 之外的所有进程都需要通过 SIGSTOP 信号停止。当所有进程都停止时,P0 必须 printf(“所有进程停止”),然后用 SIGCONT 唤醒所有进程。
我很容易就完成了这些,但问题是: 当P(n)被唤醒(被P(n-1))唤醒时,需要杀死所有进程(除了P0),然后P0 printf("End of prog")
我不能使用等待,waitpid。 我尝试让 Pn 向 P0 发送信号,然后 P0 向所有进程发送 SIGTERM 信号,但 Pn 总是在 P0 之后结束,这不好。 我还尝试过让 Pn 杀死 P(n-1) 和 P(n-1) 杀死 P(n-2),同样的问题。
无论如何,有一个想法可以确保 P9 打印消息时所有进程都被终止吗? 我对 P0 使用 SIGCHLD 来了解 P1 何时停止(因此 P2、P3,...)。我也应该能够用它来做这个,但是我怎么知道我是否在 P0 中收到这个信号,因为 P1 被杀死、恢复或停止?
最佳答案
我找到了解决方案,一旦所有进程都停止,我将使用 SA_NOCLDSTOP | 更新操作掩码SA_NOCLDWAIT 以确保一旦我的 SIGCHLD 处理程序被调用,那将是因为子进程已死亡(并且没有僵尸问题)。
关于c - 流程链从最后开始彼此结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19050227/