linux sigaction信号处理

sigaction函数相比signal函数更为复杂,但更具灵活性,下面具体介绍她的结构和用法:

 #include <signal.h>
 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

signum:要操作的信号。
act:要设置的对信号的新处理方式。
oldact:原来对信号的处理方式。 如果不需要设置

返回值:0 表示成功,-1 表示有错误发生。

  struct sigaction {
          union {
                  __sighandler_t _sa_handler;
                  void (*_sa_sigaction)(int, struct siginfo *, void *);
          } _u;
          sigset_t sa_mask;
          unsigned long sa_flags;
          void (*sa_restorer)(void);
  };
  #define sa_handler   _u._sa_handler
  #define sa_sigaction _u._sa_sigaction
    typedef struct {
        int si_signo;  //同处理器函数的信号编号
        int si_code;
        union sigval si_value; //sigqueue()发送信号时伴随的数据
        pid_t si_pid;
        long si_band;
        int si_fd;
        ...
    } siginfo_t; 

这里给出标准信号的用法:

#include <iostream>
#include <string>
#include <signal.h>

using namespace std;

void handler( int signo, siginfo_t* info, void* context)
{
    cout<<"catch "<<endl;
    if (signo == SIGINT) {
        cout<<"Crtl+c catched!"<<endl;
        sleep(3);
    }
}

int main()
{
    struct sigaction sa;
    sa.sa_sigaction = handler;
    sa.sa_flags = SA_SIGINFO;
    sigemptyset(&sa.sa_mask); //这里处理器调用过程中不阻塞任何信号,除了调用的信号。标准信号不排队,只保留一个。

    sigaction(SIGINT, &sa, NULL);

    while (1)
    {
        sleep(100);
    }
    return 0;
}

 

posted @ 2016-01-18 17:24  略加思索的河马  阅读(499)  评论(0编辑  收藏  举报