zoukankan      html  css  js  c++  java
  • 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参数返回。

    更多
  • 相关阅读:
    BZOJ3573: [Hnoi2014]米特运输
    BZOJ3531: [Sdoi2014]旅行
    BZOJ3505: [Cqoi2014]数三角形
    BZOJ3309: DZY Loves Math
    BZOJ3260: 跳
    BZOJ3252: 攻略
    BZOJ3226: [Sdoi2008]校门外的区间
    BZOJ3155: Preprefix sum
    BZOJ2843: 极地旅行社
    BZOJ2671: Calc
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3493794.html
Copyright © 2011-2022 走看看