SIGCHLD信号和waitpid(经典问题)

  • Post author:
  • Post category:其他






:SIGCHLD信号简介:




SIGCHLD属于

unix

以及类unix系统的一种信号

产生原因 siginfo_t代码值

1,子进程已终止 CLD_EXITED

2,子进程异常终止(无core) CLD_KILLED

3,子进程异常终止(有core) CLD_DUMPED

4,被跟踪子进程以陷入 CLD_TRAPPED

5,子进程已停止 CLD_STOPED

5,停止的子进程已经继续 CLD_CONTINUED

描述:

在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。

2:信号处理函数


signal( SIGCHLD, takesig );


  1. /*處理信號*/

  2. void

    takesig(

    int

    sig )
  3. {
  4. pid_t pid;

  5. int

    status;

  6. switch

    (sig) {

  7. case

    SIGHUP:
  8. received_sighup = 1;

  9. break

    ;

  10. case

    SIGTERM:
  11. quit = 1;

  12. break

    ;

  13. case

    SIGCHLD:
  14. <strong>

    while

    ( (pid = waitpid(-1, &status, WNOHANG)) > 0 ) </strong>
  15. printf(

    “child %d terminated\n”

    , pid);

  16. break

    ;
  17. }

  18. return

    ;
  19. }
/*處理信號*/
void takesig( int sig )
{
	pid_t pid;
	int status;
	switch (sig) {
	case SIGHUP:
		received_sighup = 1;
		break;
	case SIGTERM:
		quit = 1;
		break;
	case SIGCHLD:
		<strong>while ( (pid = waitpid(-1, &status, WNOHANG)) > 0 ) </strong>
                     printf("child %d terminated\n", pid); 
  	break;
	}
	return;
}


记住一点:

waitpid 和 SIGCHLD 没关系,waitpid函数不是由SIGCHILD信号驱动的,即使是某个子进程对应的 SIGCHLD 丢失了,只要父进程在任何一个时刻调用了 waitpid,那么这个进程还是可以被回收的。

以下是关于这个问题的讨论:

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=828942

转自

http://blog.csdn.net/liangyuannao/article/details/7891087