0

我有一个进程链,看起来像这个 P0(主进程)创建 P1,然后 P1 创建 P2,等等......

当创建 Pn 时(n 是一个随机数 ~ 10),除 P0 之外的所有进程都需要由 SIGSTOP 信号停止。当它们全部停止时,P0 必须 printf("All process stopped"),然后用 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 被杀死或恢复或停止?

4

1 回答 1

0

我找到了解决方案,一旦停止所有进程,我将使用 SA_NOCLDSTOP | 更新操作掩码。SA_NOCLDWAIT 以确保一旦我的 SIGCHLD 的处理程序被调用,那将是因为子进程已死(并且没有僵尸问题)。

于 2013-09-29T15:36:05.223 回答