===============================================================================
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
-------------------------------------------------------------------------------
handler 可取如下值:
* 用户定义的信号处理器
* SIG_IGN: 忽略信号
* SIG_DFL: 重置为信号的默认处理
-------------------------------------------------------------------------------
返回值为先前的设置, 若发生错误, 则返回 SIG_ERR.
-------------------------------------------------------------------------------
Linux 的 signal 函数有如下特点:
* 在可靠信号系统调用的基础上实现, 是库函数.
* 默认的原语类似 System V, 即信号发生时, 信号的处置重置为默认值.
* 如果包含 <bsd/signal.h>, 则具有 BSD signal 的原语, 即发生信号时,
信号处置的设置值不变.
===============================================================================
===============================================================================
#define SIG_ERR (void (*)()) -1
#define SIG_DFL (void (*)()) 0
#define SIG_IGN (void (*)()) 1
===============================================================================
===============================================================================
void sig_int (); /* my signal handling function */
...
signal (SIGINT, sig_int); /* establish handler */
...
sig_int ()
{
signal (SIGINT, sig_int);
/* reestablish handler for next occurrence */
... /* process the signal ... */
}
-------------------------------------------------------------------------------
* 在进入 sig_int 与再次调用 signal 之间发生的 SIGINT 信号将不会被捕获,
而由于默认设置将最终导致进程终止.
===============================================================================
===============================================================================
int sig_int_flag; /* set nonzero when signal occure */
main ()
{
void sig_int (); /* my signal handling function */
...
signal (SIGINT, sig_int); /* establish handler */
...
while (sig_int_flag == 0)
pause (); /* go to sleep, waiting for signal */
...
}
sig_int ()
{
signal (SIGINT, sig_int);
/* reestablish handler for next occurrence */
sig_int_flag = 1; /* set flag for main loop to examine */
}
-------------------------------------------------------------------------------
* 正常情况下, 上述程序将在发生 SIGINT 信号时继续运行.
* 但在测试 sig_int_flag 的值为零, 然后在调用 pause 之前发生了 SIGINT 信号,
则 pause 函数将导致进程永远休眠.
===============================================================================
![]()