一个几乎是最简单的应用如下:
#include <unistd.h> // for alarm() #include <signal.h> // for signal() #include <stdio.h> // for printf() void do_alarm(int sig) { printf("do alarm. "); alarm(1); // restart alarm } int main() { signal(SIGALRM, do_alarm); // register signal handler alarm(1); // start alarm while(1); // loop forever }
这个应用可以通过Ctrl+C结束。下面这个应用拦截Ctrl+C和Ctrl+Q:
#include <signal.h> // for signal() #include <stdio.h> // for printf() void do_sig_exit(int sig) { printf("SIGINT or SIGQUIT received. "); } int main() { signal(SIGINT, do_sig_exit); signal(SIGQUIT, do_sig_exit); while(1); // loop forever }
以上程序可以使用kill -9终止。
可中断系统调用总是会被中断,不管你是否安装了signal处理函数。
一般来说signal是不会累计的(?有例外否?)。以上面的代码为例,如果在执行do_sig_exit前产生了多次SIGINT,do_sig_exit仅执行一次。已产生的signal在进入信号处理函数时清除,如果在do_sig_exit左括号后产生了新的SIGINT,do_sig_exit会在返回后再次执行。