首先,每个信号都有一个名字。这些名字都是以三个字符SIG开头。例如,SIGABRT是夭折信号,当进程调用abort函数时产生这种信号。SIGALRM是闹钟信号,当由alarm函数设置的计时器超时后产生此信号。Linux和Solaris都支持应用程序额外定义的信号,将其作为实时扩展。
UNIX系统的信号机制最简单的接口是signal函数。
这个函数需要包入signal.h的头部文件,这个函数的原型定义如下:void (*signal(int signo, void (*func)(int)))(int);
返回值:若成功则返回信号以前的处理配置,若出错则返回SIG_ERR。
下面给大家演示一段通过拦截ctrl + c阻止进程被杀死的程序。#include
#include
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,实现了当用户想退出时执行一些收尾工作的目的。