• 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;
    }
  • 相关阅读:
    asy for
    asy html !
    lib
    git clone 指定 version tag
    git tag
    git clone <url>--depth 、 git clone <url> --recursive
    xelatex CLI
    rsync
    curl options
    [转自]C语言offset_of宏和container_of宏
  • 原文地址:https://www.cnblogs.com/kaishan1990/p/5139919.html
Copyright © 2020-2023  润新知