我正在玩弄信号:SIGSTOP特别SIGCONT是。这是我写的一个测试程序。这个想法是创建一个 N + 1 个进程链(包括主进程)。每个人都必须等待其孩子停止,然后自己停止。当子进程停止时,主进程必须唤醒它的子进程。
为此,该f函数递归地创建流程链。SIGCHLD除了最后一个直接停止自身的子进程之外,每个进程都对信号使用 sigsuspend 。当它的子进程停止时,进程将收到信号SIGCHLD,然后它可以轮流停止。当主进程收到SIGCHLD信号时,意味着所有进程都处于停止状态,因此它会将信号发送SIGCONT给其子进程。每个进程都会发送SIGCONT给自己的子进程,然后退出,除了最后一个刚刚退出的子进程。
我试图说清楚:删除了返回代码测试并写了一些注释。
执行程序时,除了链条之外,一切似乎都很好SIGCONT
。一些进程被唤醒,但不是全部。查看正在运行的程序(例如 ps),一切似乎都很好:没有阻塞的进程。我真的不明白这个程序可能有什么问题。欢迎任何帮助或提示。
这是一个示例跟踪。正如您所看到的,“分叉链”进展顺利,进程在 上挂起SIGCHLD。然后最后一个子进程生成并停止。这会SIGCHLD在父进程上创建一条“链”,因为每个进程都会自行停止。当主进程收到通知时,SIGCHLD它会发送SIGCONT给它的子进程,子进程会被唤醒,然后发送SIGCONT给它自己的子进程,等等。您可以注意到这个链并不完整:
$ ./bin/trycont
n pid log
0 6257 "suspending on SIGCHLD"
1 6258 "suspending on SIGCHLD"
2 6259 "suspending on SIGCHLD"
3 6260 "suspending on SIGCHLD"
4 6261 "suspending on SIGCHLD"
5 6262 "last child - stopping"
4 6261 "got …Run Code Online (Sandbox Code Playgroud)