信号

    (记录只是重新温固!)

    信号提供了一种处理异步事件的方法,很多情况下都很有用,例如处理父子进程,程序退出等等。


2014-3-16

信号的内容挺多,这里只是记录常用的一些信息,其余的后期完善。


1. 我们可以把某个信号的处置设定为SIG_IGN来忽略它。SIGKILL 和 SIGSTOP 这两个信号不能被忽略。

2. 信号机制最简单的接口是 signal 函数

     void (*signal (int signo, void (*func) (int))) (int);

     由于原型过于复杂,我们通常会进行如下处理:

      typedef  void Sigfunc(int);

      Sigfunc * signal(int , Sigfunc *);

3.  sigaction 函数

     int sigaction(int signo, const struct sigaction *restrict act,
               struct sigaction *restrict oact);

     注意: 若act非空,则要修改其动作。如果oact非空,则系统经由oact返回该信号的上一个动作。

     struct  sigaction {

             (*sa_handler) (int);   /* addr of signal handler, or SIG_IGN, or SIG_DFL */

             sigset_t sa_mask;     /* additional signals to block */

             int  sa_flags;

             void (*sa_sigaction) (int,siginfo_t*,void*);  /* alternte handler */

        };

     详解:(后续)

     sigaction 函数的功能是检查或修改与指定信号相关联的处理动作。取代signal函数。

     signal函数由于历史原因,或者已经被修改或者不可靠,所以当需要处理信号的时候可以直接掉用sigaction

     或者 调用 sigaction 实现的signal函数(下方)。

    

Sigfunc * signal(int signo, Sigfunc * func) {
    struct sigaction  act, oact;
    act.sa_handler = func;
    sigemptyset(&act.sa_mask);

    act.sa_flags = 0;
    if(signo == SIGALRM) {
#ifdef SA_INTERRUPT
        act.sa_flags |= SA_INTERRUPT;
#endif
    }
    else {
#ifdef SA_RESTART
        act.sa_flags |= SA_RESTART;
#endif
    }
    if(sigaction(signo, &act, &oact) < 0)
        return (SIG_ERR);
    return (oact.sa_handler);
}

(待续)

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值