0
点赞
收藏
分享

微信扫一扫

TCP客户/服务器程序示例——POSIX信号处理

柠檬果然酸 2022-03-22 阅读 64

SIGCHLD信号就是由内核在任何一个进程终止时发给它的父进程的一个信号。

signal函数:

#include "unp.h"

Sigfunc * signal(int signo,Sigfunc *func)
{
	struct sigactionact oact;
	act.sa_handler = func;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	if(signo == SIGALRM){
#ifdef SA_INTERRUPT
		act.sa_flags |= SA_INTERRUPT;		
#endif 
	} else {
#ifdef SA_RESTART
		act.sa_flags |= SA_RESTART;
	}
#endif
	if( sigaction(signo,&act,&oact)<0)
		return(SIG_ERR);

	return (oact.sa_handler);
}

设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。这些信息包括子进程的进程ID,终止状态以及资源利用信息(CPU时间,内存使用量等等)。如果一个进程终止,而该进程有子进程处于僵死状态,那么它的所有僵死子进程的父进程ID将被重置我为1(init进程),继承这些子进程的init进程将清理它们。(也就是说init进程僵wait它们,从而去除它们的僵死状态)。

处理僵死进程

之前我们说到不愿意留存僵死进程,它会占用内核空间,最终可能导致资源耗尽。所以我们无论何时fork子进程时都要wait他们,以防止变成僵死进程。因此我们建立一个处理SIGCHLD信号的处理函数。

举报

相关推荐

0 条评论