SIGCHLD
信号详解
SIGCHLD
信号是专门用于父进程处理子进程状态变化的信号。在 Unix 和 Linux 系统中,当子进程的状态发生变化时,内核会向其父进程发送 SIGCHLD
信号,以通知父进程子进程的终止或状态变更。
1. SIGCHLD
信号的触发条件
SIGCHLD
信号通常在以下几种情况下被触发:
-
子进程正常退出:
- 当子进程执行完成并退出时(如调用
exit()
或return
),父进程会收到SIGCHLD
信号,通知子进程已终止并变为僵尸进程(Zombie Process)。
- 当子进程执行完成并退出时(如调用
-
子进程被信号中断或终止:
- 当子进程因接收到某个信号而中断或被强制终止(如
SIGKILL
,SIGTERM
),父进程也会收到SIGCHLD
信号。
- 当子进程因接收到某个信号而中断或被强制终止(如
-
子进程被暂停或恢复:
- 当子进程接收到
SIGSTOP
(暂停)、SIGTSTP
(Ctrl+Z 暂停)、SIGCONT
(恢复)等信号时,父进程也会收到SIGCHLD
信号,表示子进程状态发生了暂停或恢复。
- 当子进程接收到
2. SIGCHLD
信号的主要用途
SIGCHLD
信号在父子进程关系中具有以下用途:
-
回收子进程资源,避免僵尸进程:
- 当子进程退出后,如果父进程没有使用
wait()
或waitpid()
回收其状态信息,则子进程会变成僵尸进程,占用系统进程表项。 SIGCHLD
信号通知父进程子进程状态的变化,使父进程可以及时回收子进程资源,避免系统中出现过多僵尸进程。
- 当子进程退出后,如果父进程没有使用
-
监控子进程的状态:
- 通过
SIGCHLD
信号,父进程可以监控子进程的状态,如是否被暂停、是否恢复或是否意外终止。 - 父进程可基于这些状态变化做出相应的处理(例如在子进程失败时重启子进程,或在子进程暂停时进行恢复操作)。
- 通过
3. SIGCHLD
信号的使用与处理示例
使用信号处理函数(Signal Handler)处理 SIGCHLD
信号,通常是通过 sigaction
或 signal
函数来设置信号处理器。下面是一个处理 SIGCHLD
信号以回收子进程资源的示例代码:
#include <stdio.h>
#include <stdlib.h>
#