Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138715
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 247
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-12 22:24
个人简介

学霸

文章分类

全部博文(20)

文章存档

2016年(1)

2015年(11)

2014年(8)

我的朋友

分类: LINUX

2014-10-26 17:43:09

一、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.连续发送几次相同信号,不一定会被响应相同次数
阅读(1478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~