• ZT sigprocmask,sigpending函数


    sigprocmask,sigpending函数

    分类: LINUX 905人阅读 评论(0) 收藏 举报

    【sigprocmask系统调用】
    功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。
    用法:
    #include <signal.h>
    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    参数:
    how:用于指定信号修改的方式,可能选择有三种

    SIG_BLOCK //加入信号到进程屏蔽。
    SIG_UNBLOCK //从进程屏蔽里将信号删除。
    SIG_SETMASK //将set的值设定为新的进程屏蔽。

    set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。
    oldset:也是指向信号集的指针,在此存放原来的信号集。
    返回说明:
    成功执行时,返回0。失败返回-1,errno被设为EINVAL。
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    #include <stdlib.h>
    //#include <>

    static void sig_quit(int signo)
    {
    printf("caught SIGQUIT/n");
    signal(SIGQUIT, SIG_DFL);//将SIGQUIT的动作设为缺省值
    }
    int main()
    {
    sigset_t newmask;
    sigset_t oldmask;
    sigset_t pendmask;

    signal(SIGQUIT, sig_quit);//信号量捕捉函数,捕捉到SIGQUIT,跳转到函数指针sig_quit处执行

    sigemptyset(&newmask);//初始化信号量集
    sigaddset(&newmask, SIGQUIT);//将SIGQUIT添加到信号量集中

    sigprocmask(SIG_BLOCK, &newmask, &oldmask);//将newmask中的SIGQUIT阻塞掉,并保存当前信号屏蔽字到Oldmask

    sleep (5);//休眠5秒钟,这里做说明:在5s休眠期间,任何SIGQUIT信号都会被阻塞,如果在5s内收到任何键盘的quit信号,则此时会把这些信息存在内核的队列中,等待5s结束后,可能要处理此信号。 
    sigpending(&pendmask);//检查信号是悬而未决的,

    if (sigismember(&pendmask, SIGQUIT))//SIGQUIT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
    {
    printf("/nSIGQUIT pending/n");
    }
    sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢复被屏蔽的信号SIGQUIT

    /**开始处理信号,调用信号处理函数*/ 
    printf("SIGQUIT unblocked/n");

    sleep(5);//再次休眠5秒钟

    return (0);

    }
    以上示例是Linux redhat,
    执行结果是
    $./a.out
    ^/                        /**此处使用"CTRL+/" 产生SIGQUIT */ 
    SIGQUIT pending
    caught SIGQUIT 在sigprocmask返回之前处理阻塞信号SIGQUIT,输出它
    SIGQUIT unblocked
    ^/Quit (coredump)//因为已经被设置为缺省值,所以再次产生SIGQUIT 信号,直接退出


    【sigpending系统调用】

    #include<signal.h>

    int sigpending(sigset_t *set);

    sigpending函数返回信号集,其中的各个信号对于调用进程是堵塞的而不能递送,因而也一定是未决的。该信号集通过set参数返回。

    更多
  • 相关阅读:
    (三)认识twisted reactor
    (二)inlineCallbacks,同步方式写异步代码
    (一)使用twisted Deferred
    javascript通过字典思想操作数据
    锱铢必较,从(function(){}())与(function(){})()说起
    针对谷歌默认最小字体12px的正确解决方案 (css、html)
    百度搜索研发部:同义词反馈机制
    LinkedList与ArrayList的区别
    从源码的角度分析List与Set的区别
    springboot整合redisson分布式锁
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3493794.html
Copyright © 2020-2023  润新知