一、example
#include
#include
#include
void msg_out(int signal)
{
printf("the signal is %d",signal);
exit(0);
}
void time_up(int signal)
{
printf("the signal is %d",signal);
raise(SIGINT);
}
int catch_signal(int signal,void (*handler)(int))
{
struct sigaction sigact;
sigact.sa_handler = handler;
sigact.sa_flags = 0;
sigemptyset(&sigact.sa_mask);
return sigaction(signal,&sigact,NULL);
}
int main(void)
{
char get_value[20] = {0};
catch_signal(SIGALRM,&time_up);
catch_signal(SIGINT,&msg_out);
while(1)
{
alarm(3);
printf("input a string int 3 sec please.\n");
scanf("%s",get_value);
printf("what input string is %s\n",get_value);
}
return 0;
}
该程序虽然短小,却包含了信号的基本思想。
1.用户可以通过Ctrl+c或超过3秒未输入及退出
2.介绍了两种信号的使用(SIGALRM and SIGINT)
3.alarm时钟的使用
4.信号的注册
5.信号处理器的定义
6.raise信号升级
二、其它常用信号
1.进程被中断(SIGINT)2.终端窗口的大小发生改变(SIGWINCH) 3.进程企图访问非法存储器地址(SIGSEGV)
4.有人要求内核终止进程(SIGTERM)5.进程在向一个没有人读的管道写数据(SIGPIPE)
6.浮点错误(SIGFPE)7.调试人员询问进程执行到哪里(SIGTRAP)
8.有人要求停止进程,并把存储器中的内容保存到核心转储文件(SIGQUIT)
9.还原信号默认处理器(SIG_DFL)10.忽略某一个信号(SIG_IGN)11.用户无法忽略的信号(SIGSTOP/SIGKILL)
三、使用信号用注意的一些问题
1.复杂的程序中要小心使用在处理器函数中使用标准输入和标准输出,之所以会有信号就是因为程序中发生了故障,
而故障可能就是标准输入/出无法使用造成的
2.在程序中不要同时使用alarm与sleep,二者会发生冲突
3.一个进程最多使用一个定时器,定时器有操作系统的内核管理,如果一个进程有很多定时器,内核就好变得很慢
4.进程在处理信号时会停止一切工作,也就是说一次只能做一件事
5.信号的发送顺序与进程对信号的接收顺序没有一定的关系
6.操作系统用信号来控制进程,程序通常用信号来结束
7.大部分错误信号的默认处理器会终止程序
8.连续发送几次相同信号,不一定会被响应相同次数
阅读(1470) | 评论(0) | 转发(0) |