在signal.h中定义了sigaction的结构
引用:struct sigaction
{ sigset_t mask,
int sa_flags;
void (* handler)(int);
void (* sa_sigaction)(int,siginfo_t *,void *);
}
mask表示在进程捕抓到信号,进行信号处理时要阻塞的信号集,默认把当前信号也包括在内,不过可以通过sa_flags进行设置了。
sa_flags为一系列宏,主要有:
SA_RESTART,因为处理信号导致不二阻塞的系统调用在信号处理函数结束后自动重启。
SA_NODEFER,不阻塞当前信号
SA_SIGINFO,信号处理函数为 sa_sigaction。(一般不用这个,除非要知道处理信号的那个进程的详细情况。)
在实际中往往是把sigaction封装在自定义的signal中进行处理.如:
引用:typedef void (* sig_func)(int);
sig_func signal(int signo, sig_func func)
{ struct sigaction nact,oact;
sigemptyset(&nact.mask);
sigaddset(nact.mask, SIGINT);
nact.sa_flags=SA_RESTART|SA_NODEFER;
nact.handler=func;
if(sigaction(signo,nact,oact)<0)
return SIG_ERR
else return oact.handler;
}
signal设置了信号的处理函数,并且返回该信号的上一次处理函数。
当然,这只是基本操作了,在信号处理函数中还可以调用一些其他的处理函数,例如sigsuspend,sigsetjump,siglongjump等。
总之,信号处理是unix中较难的内容,在高级unix编程中会需要使用。