(记录只是重新温固!)
信号提供了一种处理异步事件的方法,很多情况下都很有用,例如处理父子进程,程序退出等等。
2014-3-16
信号的内容挺多,这里只是记录常用的一些信息,其余的后期完善。
1. 我们可以把某个信号的处置设定为SIG_IGN来忽略它。SIGKILL 和 SIGSTOP 这两个信号不能被忽略。
2. 信号机制最简单的接口是 signal 函数
void (*signal (int signo, void (*func) (int))) (int);
由于原型过于复杂,我们通常会进行如下处理:
typedef void Sigfunc(int);
Sigfunc * signal(int , Sigfunc *);
3. sigaction 函数
int sigaction(int signo, const struct sigaction *restrict act,
struct sigaction *restrict oact);
注意: 若act非空,则要修改其动作。如果oact非空,则系统经由oact返回该信号的上一个动作。
struct sigaction {
(*sa_handler) (int); /* addr of signal handler, or SIG_IGN, or SIG_DFL */
sigset_t sa_mask; /* additional signals to block */
int sa_flags;
void (*sa_sigaction) (int,siginfo_t*,void*); /* alternte handler */
};
详解:(后续)
sigaction 函数的功能是检查或修改与指定信号相关联的处理动作。取代signal函数。
signal函数由于历史原因,或者已经被修改或者不可靠,所以当需要处理信号的时候可以直接掉用sigaction
或者 调用 sigaction 实现的signal函数(下方)。
Sigfunc * signal(int signo, Sigfunc * func) {
struct sigaction act, 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);
}
(待续)