SIGCHLD

在Linux系统下,子进程状态改变后产生此信号,如子进程停止(STOP)、子进程终止(terminate)等。

在Linux系统下,如果进程明确地将该信号的配置设置为SIG_IGN,则调用进程的子进程将不产生僵死进程。注意,这与其默认动作(SIG_DFL)“忽略”不同。

在Linux系统下,如果使用sigaction将信号SIGCHLD的sa_flags中的SA_NOCLDSTOP选项打开,当子进程停止(STOP作业控制)时,不产生此信号(即SIGCHLD)。不过,当子进程终止时,仍旧产生此信号(即SIGCHLD)。

在Linux系统下,如果使用sigaction将信号SIGCHLD的sa_flags中的SA_NOCLDWAIT选项打开,则当调用进程的子进程终止时,不创建僵死进程(Zombie)。

POSIX.1说明,在SIGCHLD未决(pending)期间,如若wait或waitpid返回了子进程的状态,那么SIGCHLD信号不应递送(delivery)给该父进程,除非另一个子进程的状态也可用。FreeBSD 8.0、Mac OS X10.6.8和Solaris10都实现了这种语义。但是Linux3.16.0没有实现这种语义,在调用进程阻塞(Block)了SIGCHLD后,并且在调用进程waitpid子进程之后,SIGCHLD保持为未决;当解除了对此信号的阻塞后,它被递送至调用者进程。如果在调用进程中捕获了SIGCHLD,在捕获函数中调用wait,Linux系统将返回-1,并将errno设置为ECHILD。这是因为已经取到了子进程的终止状态。

你可能感兴趣的:(Linux)