Linux内核中SIGCHLD信号为何不中断wait()系统调用?
关于wait()未被SIGCHLD中断反而成功返回的原因
- 核心逻辑是wait()与SIGCHLD信号的设计是联动的:当子进程终止时,内核会同时完成两个操作——将子进程的退出状态存入父进程的等待队列,以及向父进程发送SIGCHLD信号。
- 当父进程阻塞在wait()调用上时,子进程终止这个事件已经直接满足了wait()的等待条件。此时SIGCHLD信号的到来只是触发了信号处理函数的执行,但wait()的等待目标已经达成,所以信号处理函数执行完毕后,wait()会正常返回子进程的退出状态,而非被信号中断返回-1。
- 对比异常场景:只有当父进程在wait()阻塞时收到非SIGCHLD的其他信号(比如SIGINT),且该信号的处理方式未设置
SA_RESTART时,wait()才会被中断,返回-1并将errno设为EINTR。 - 额外补充:如果父进程未处于wait()阻塞状态,收到SIGCHLD信号后,通常会在信号处理函数中调用wait()来回收子进程;但如果已经在wait()阻塞,子进程终止的事件直接触发wait()完成回收,信号只是额外触发处理函数,不会打断wait()的正常流程。
内容的提问来源于stack exchange,提问作者meowrainy
相关产品推荐
相关产品推荐

