父进程对子进程的监控(SIGCHLD信号与waitpid)

知识点1:子进程退出时既exit(1),内核为子进程保留一定的数据结构,包含进程ID、进程的终止状态(结束状态,退出码)、进程 CPU的使用时间等;如果对此数据结构不进行回收处理,会一直保留在内存中,占用内存的使用,这也是产生僵尸进程产生的原因。                      

知识点2:子进程终止时会向父进程发送SIGCHLD信号,父进程对此信号是默认处理,既不管不问,数据结构会一直残存在内 存中。

知识点3linux的信号处理机制是不支持排队的,既一个信号在发生后进入信号处理函数时,相同的信号多次发生,此时信号理函数只执行一次

僵尸进程的处理: 方法1:忽略,signal(SIGCHLD,SIG_IGN),所谓的忽略是指交由内核处理回收,常用的技巧

                            方法2:捕获,安装信号处理函数,对残存的数据结构进行处理,例如使用wait/waitpid对退出的子进程进行                               监控;

static VOID     signal_handler( INT signo)
{
	INT pid = 0;
	INT status = 0;
	while((pid = waitpid( -1, &status, WNOHANG)) > 0)//循环处理退出的子进程,获取退出的状态
	{
		printf("child_id = %d\n",pid);
		printf("-------------------\n");
		if( WIFEXITED(status) )
		{
			printf("exit_code = %d\n",WEXITSTATUS(status));
		}
		if( WIFSIGNALED(status))
		{
			printf("signal_code = %d\n",WTERMSIG(status));
		}
	}
	if( pid < 0)
	{
		printf("Errno = %s\n",strerror(errno));
		while(1);
	}	
}
                         方法3:父进程使用wait/waitpid来对子进程进行监控;  

方法4:父进程先终止,子进程变为孤儿进程,此时由init进程来管理(PID号1,亦是此时子进程的父进程PID号);

                                     比如:父进程——子进程——孙进程,令父进程wait/waitpid子进程退出,子进程先退出,此时孙进                                                 程变成孤儿进程,由init托管,残留的数据结构由init回收处理。

                     

猜你喜欢

转载自blog.csdn.net/caozhigang129/article/details/79163557