1. sigaction安装:
结构sigaction定义如下:
struct sigaction{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t *,void *);
};
sa_hanlder: 一个带有int参数的函数指针, 或者SIG_IGN(忽略), 或者SIG_DFL(默认).
sa_mask: 信号屏蔽字(集). 当该信号处理函数返回时, 屏蔽字恢复.
sa_sigaction: 替代的信号处理程序, 当使用了SA_SIGINFO标志时, 使用该信号处理程序.
sa_flag是一个选项,主要理解三个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
一般的用法:
struct sigaction newaction;
newaction.sa_handler = handle;
newaction.sa_flags = 0;//SA_RESTART;
sigemptyset(&newaction.sa_mask);
sigaddset(&newaction.sa_mask, 12); //设置上后,处理此信号期间,不会再收到此信号
sigaction(12, &newaction, NULL);
2. signal
可以用sigaction实现:
sig_func *signal(int signo, sig_func *func);
{
structsigaction act, oact;
act.sa_handler =func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (sigaction(signo,&act, &oact) < 0)
returnSIG_ERR;
return oact.sa_hanlder;
}