C套接字编程中SIGCHLD处理函数里waitpid循环的必要性探讨
为什么SIGCHLD处理函数里需要循环调用waitpid()?
这个循环绝对必要,核心原因要从Unix/Linux系统的信号机制说起:
- 信号不排队,会合并:当多个子进程几乎同时终止时,内核不会给每个子进程都发一次SIGCHLD信号,而是只发一次。如果处理函数里只调用一次
waitpid(),就只能回收一个僵尸进程,剩下的会一直留在系统里,变成僵尸进程占用资源。 - 非阻塞waitpid的作用:处理函数里用的是
waitpid(-1, NULL, WNOHANG),其中-1表示等待任意一个终止的子进程,WNOHANG参数让调用变成非阻塞——如果当前没有子进程终止,waitpid()会立刻返回0而不是阻塞。循环调用这个,就能一次性把所有已经终止的子进程都捞出来回收,不会漏掉任何一个。 - 防止僵尸进程堆积:对于Beej书里的多进程服务器来说,高并发场景下很容易出现多个客户端请求处理完成、子进程同时退出的情况。没有这个循环的话,僵尸进程会越积越多,最终占满进程表,导致系统无法创建新进程。
简单说,这个循环就是为了应对「多个子进程同时终止但只收到一次SIGCHLD」的场景,确保所有僵尸进程都被及时回收。
内容的提问来源于stack exchange,提问作者snailontheslope
相关产品推荐
相关产品推荐

