首先,每个信号都有一个名字。这些名字都是以三个字符SIG开头。例如,SIGABRT是夭折信号,当进程调用abort函数时产生这种信号。SIGALRM是闹钟信号,当由alarm函数设置的计时器超时后产生此信号。Linux和Solaris都支持应用程序额外定义的信号,将其作为实时扩展。
UNIX系统的信号机制最简单的接口是signal函数。
这个函数需要包入signal.h的头部文件,这个函数的原型定义如下:
void (*signal(int signo, void (*func)(int)))(int);
返回值:若成功则返回信号以前的处理配置,若出错则返回SIG_ERR。
下面给大家演示一段通过拦截ctrl + c阻止进程被杀死的程序。
#include <stdio.h> #include <signal.h> void sig_init(int sigo) { printf("received SIG\n"); } int main(void) { int pid; pid = getpid(); printf("The process ID is %d\n", pid); if(signal(SIGINT, sig_init) == SIG_ERR) { printf("can't not catch SIGINT\n"); return -1; } while(1) { pause(); } return 0; }
由于这个函数直接禁止了默认方法,也就是说ctrl+c失效了。所以当用户输入ctrl+c时,只会打印出
^Creceived SIG
程序并不会退出,所以就起到了成功拦截ctrl+c的信号的作用。例如tomcat,通过拦截ctrl+c,实现了当用户想退出时执行一些收尾工作的目的。