=============================================================================== #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 函数将导致进程永远休眠. ===============================================================================