You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C套接字编程中SIGCHLD处理函数里waitpid循环的必要性探讨

为什么SIGCHLD处理函数里需要循环调用waitpid()?

这个循环绝对必要,核心原因要从Unix/Linux系统的信号机制说起:

  • 信号不排队,会合并:当多个子进程几乎同时终止时,内核不会给每个子进程都发一次SIGCHLD信号,而是只发一次。如果处理函数里只调用一次waitpid(),就只能回收一个僵尸进程,剩下的会一直留在系统里,变成僵尸进程占用资源。
  • 非阻塞waitpid的作用:处理函数里用的是waitpid(-1, NULL, WNOHANG),其中-1表示等待任意一个终止的子进程,WNOHANG参数让调用变成非阻塞——如果当前没有子进程终止,waitpid()会立刻返回0而不是阻塞。循环调用这个,就能一次性把所有已经终止的子进程都捞出来回收,不会漏掉任何一个。
  • 防止僵尸进程堆积:对于Beej书里的多进程服务器来说,高并发场景下很容易出现多个客户端请求处理完成、子进程同时退出的情况。没有这个循环的话,僵尸进程会越积越多,最终占满进程表,导致系统无法创建新进程。

简单说,这个循环就是为了应对「多个子进程同时终止但只收到一次SIGCHLD」的场景,确保所有僵尸进程都被及时回收。

内容的提问来源于stack exchange,提问作者snailontheslope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:12:05