• Linux学习笔记19——信号2


      上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数。

    一  sigaction函数的作用

      定义在接收到参数sig指定的信号后应该采取的行动,声明如下:

    #include <signal.h>
    
    int sigaction(int sig,                //指定动作的信号码
            const struct sigaction * act,    //说明要采取的动作,如果为NULL,对sigaction的调用就不能改变与信号相关的动作
            struct sigaction *oact        //负责接收与信号相关的前一个动作,如果为NULL,对sigaction的调用就不会返回与信号相关的前一个动作
            );

      我们注意到,上面的参数中出现了struct sigaction的结构,该结构体的成员如下:  

    struct sigaction{
    
        void (*sa_handler)(int);    //SIG_DFL,SIG_IGN或者指向函数的指针,SIG_DFL的值说明sigaction应该恢复信号的默认行为,
                          //                   SIG_IGN的值说明进程应该忽略信号 
        sigset_t sa_mask;        //处理程序的执行过程中需要阻塞的额外的信号
    
        int sa_flags;           //特殊的标志符和选项
    
      }

      参数sa_flags的取值如下:

      SA_NOCLDSTOP     子进程停止时不产生SIGCHLD信号
      SA_RESETHAND      将对此信号的处理方式在信号处理函数的入口重置为SIG_DFL
      SA_RESTART      重启可中断的函数而不是给出EINTR错误
      SA_NODEFER     捕获到信号时不将它添加到信号掩码中

      例子:

    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    
    void ouch(int sig){
        printf("OUCH! - I got signal %d
    ",sig);
    }
    
    int main(){
        struct sigaction act;
        act.sa_handler=ouch;
        act.sa_flags=0;
        sigemptyset(&act.sa_mask);
        
        sigaction(SIGINT,&act,0);
        
        while(1){
            printf("Hello world
    ");
            sleep(1);
        }
    }

    结果如下:

    二 等待信号——sigsuspend和sigwait

      1 sigsuspend函数

    #include <signal.h>
    
    int sigsuspend(const sigset_t *sigmask);

      sigsuspend函数用sigmask指向的那个掩码来设置信号掩码,并将进程挂起,直到进程捕捉到信号为止。

      2 sigwait函数

    #include <signal.h>
    
    int sigwait(const sigset_t *restrict sigmask,int *restrict signo);

      sigwait函数一直阻塞到*sigmask指定的任何一个信号被挂起为止,然后从挂起信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起信号集中删除的信号的个数被存储在signo指向的那个位置中。

      3 sigsuspend和sigwait区别

      这两个函数的第一个参数都是指向信号集的指针(sigset_t *)。对sigsuspend来说,这个信号集装载的是新的信号掩码,因此不在信号集中的信号是能使sigsuspend返回的信号。对sigwait来说,这个参数中装载的是需要等待的信号集,因此在信号集中的信号是能使sigwait返回的信号。与sigsuspend不同,sigwait没有改变进程的信号掩码,sigmask中的信号应该在调用sigwait之前被阻塞起来。

  • 相关阅读:
    Vue $nextTick的一个使用场景
    Vue 使用v-for对Object进行遍历
    JavaScript 回调函数的简单示例
    VSCode 自定义Vue snippets, 快速生成Vue模板
    git将一个分支完全覆盖另外一个分支如:dev分支代码完全覆盖某一个开发分支
    解决bootstrap时间输入框总被浏览器记住的记录遮挡住的问题
    Fiddler 屏蔽JS、抓WebSocket协议、查看接口响应时间、模拟并发请求
    细说MySQL的时间戳(Timestamp)类型
    网站建设之域名注册和域名备案
    日常项目测试用例检查点(来自一线测试人员的吐血总结)
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3499559.html
Copyright © 2020-2023  润新知