在linux中信号9和19不可忽略;
可使用kill -l来查看所有信号,共有64个;
一个简单的捕获信号例子,用来模拟中断
include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
void handler(int sig);
int main(int argc, char *argv[])
{
//old signal
__sighandler_t oldhandler;
//creat signal with "Ctrl + C"
oldhandler = signal(SIGINT, handler);
if (oldhandler == SIG_ERR)
ERR_EXIT("signal error");
//whatever "char" input
while (getchar() != '\n')
;
//reset signal to orignal
if (signal(SIGINT, oldhandler) == SIG_ERR)
ERR_EXIT("signal error");
for (;;);
return 0;
}
void handler(int sig)
{
printf("recv a sig=%d\n", sig);
}
运行上面的程序:
一开始加入了一个SIGINT信号(可以从键盘ctrl + C来输入);
当输入ctrl + c时,打印收到的信号,如下所示:
[root@localhost signal]# ./01signal
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
当随意输入一个字符后,信号恢复之前的设置,再次按下ctrl+c就没有输出了;
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
^Crecv a sig=2
g
^C
按下ctrl+c就没有反映了