信号的概念
在linux中信号是一个32位的整型值,代表一个简单的信息,每个信号都有一个以SIG开头的名字,其实也就是系统定义的宏。在命令行模式下使用kill -l可以查看当前系统支持的所有信号。
或者使用man 7 signal查看信号的详细信息
一、信号的产生
信号由内核产生,有三种方式可以使得内核产生信号
1.用户操作
如【ctrl+c】
2.进程执行出错
数据的溢出。
3.进程执行系统调用
调用kill向某个进程发送信号。
二、信号的响应方式
1.忽略信号
#include<stdio.h>
#include <signal.h>
void handler(int signum)
{
printf("signum is %d\n",signum);
switch(signum)
{
case SIGINT://2
printf("I get signal!\n");
break;
default:
printf("other signal!\n");
}
}
int main()
{
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
int count=0;
if(signal(SIGINT,SIG_IGN)!=SIG_ERR)
//if(signal(SIGINT,handler)!=SIG_ERR)
{
while(1)
{
sleep(2);
printf("count=%d\n",count);
count++;
}
}
return 0;
运行结果:
用户按下ctrl+c无回应,即忽略信号
2.执行系统默认操作
#include<stdio.h>
#include <signal.h>
int main()
{
// typedef void (*sighandler_t)(int);
// sighandler_t signal(int signum, sighandler_t handler);
int count=0;
//if(signal(SIGINT,SIG_IGN)!=SIG_ERR)
//if(signal(SIGINT,handler)!=SIG_ERR)
{
while(1)
{
sleep(2);
printf("count=%d\n",count);
count++;
}
}
return 0;
}
运行结果
用户执行ctrl+c程序结束运行
3.捕捉信号
用户按下ctrl+c信号处理函数捕捉信号并输出对应的语句,但是程序还是在while循环,没有退出。