当subprocess终止时理解SIGCHLD

我无法理解以下程序的输出。 我观察到在subprocess返回后,父进程在wait()之前3秒没有睡眠。 如果SIGCHLD被设置为默认处理程序,那么它会hibernate3秒钟,等待并按预期返回。 到底发生了什么?

# include <unistd.h> # include <sys/types.h> # include <stdio.h> # include <sys/wait.h> # include <signal.h> void handler(int sig) { printf("Iam in handler ...\n"); } main() { int status; pid_t pid; struct sigaction act; //act.sa_flags=SA_NOCLDSTOP; act.sa_handler=handler; sigaction(SIGCHLD,&act,NULL); if(!fork()) { printf("child process id is %d\n",getpid()); return 1; } printf("xxx ...\n"); sleep(3); pid = wait(&status); printf("process terminated is %d\n",pid); } output:: xxx ... child process id is 2445 Iam in handler ... process terminated is 2445 

Solutions Collecting From Web of "当subprocess终止时理解SIGCHLD"

当子进程死亡时,一个SIGCHLD被发送给父进程。 在你的情况下,它会中断sleep ,看起来好像进程没有睡觉。

问题的要点: sleep在被信号中断时不会重新启动。

从男人睡觉() :

睡眠()使调用线程睡眠,直到秒已过或信号到达不被忽略。

你的孩子终止会引起一个信号来唤醒你。

来自sleep()的返回值:

如果所请求的时间已经过去,则为零,或者如果呼叫被信号处理程序中断,则返回休眠的秒数。

可以使用,如果你想帮助你“完成”的睡眠。

 unsigned sleep_time = 3; ... while((sleep_time = sleep(sleep_time)) > 0) {} pid = wait(&status); ...