zoukankan      html  css  js  c++  java
  • 打印未决信号集

    信号集操作函数

    内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。

    信号集设定

           sigset_t  set;        // typedef unsigned long sigset_t;

    int sigemptyset(sigset_t *set);                   将某个信号集清0                 成功:0;失败:-1

        int sigfillset(sigset_t *set);                          将某个信号集置1                 成功:0;失败:-1

        int sigaddset(sigset_t *set, int signum);            将某个信号加入信号集            成功:0;失败:-1

        int sigdelset(sigset_t *set, int signum);              将某个信号清出信号集            成功:0;失败:-1

        int sigismember(const sigset_t *set, int signum);判断某个信号是否在信号集中  返回值:在集合:1;不在:0;出错:-1 

        sigset_t类型的本质是位图。但不应该直接使用位操作,而应该使用上述函数,保证跨系统操作有效。

        对比认知select 函数。

    sigprocmask函数

    用来屏蔽信号、解除屏蔽也使用该函数。其本质,读取或修改进程的信号屏蔽字(PCB中)

        严格注意,屏蔽信号:只是将信号处理延后执行(延至解除屏蔽);而忽略表示将信号丢处理。

    int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 成功:0;失败:-1,设置errno

    参数:

                  set:传入参数,是一个位图,set中哪位置1,就表示当前进程屏蔽哪个信号。

                  oldset:传出参数,保存旧的信号屏蔽集。

                  how参数取值:   假设当前的信号屏蔽字为mask

    1. SIG_BLOCK: 当how设置为此值,set表示需要屏蔽的信号。相当于 mask = mask|set
    2. SIG_UNBLOCK: 当how设置为此,set表示需要解除屏蔽的信号。相当于 mask = mask & ~set
    3. SIG_SETMASK: 当how设置为此,set表示用于替代原始屏蔽及的新屏蔽集。相当于 mask = set若,调用sigprocmask解除了对当前若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。

    sigpending函数

    读取当前进程的未决信号集

    int sigpending(sigset_t *set);       set传出参数。   返回值:成功:0;失败:-1,设置errno

    练习:编写程序。把所有常规信号的未决状态打印至屏幕。                           【sigpending.c】

    /***
    printped.c
    ***/
    #include<stdio.h>
    #include<unistd.h>
    #include<signal.h>
    
    void printped(sigset_t *ped)
    {
        int i;
        for(i = 1; i < 32; i++)
        {
            if(sigismember(ped,i))
            {
                putchar('1');
            }
            else    
            {
                putchar('0');
            }
        }
        printf("
    ");
    }
    
    int main()
    {
        sigset_t myset,oldset,ped;
        sigemptyset(&myset);
        sigaddset(&myset,SIGQUIT);
        sigprocmask(SIG_BLOCK,&myset,&oldset);
        
        while(1)
        {
            sigpending(&ped);
            printped(&ped);
            sleep(1);
        }
        return 0;
    }
  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11333266.html
Copyright © 2011-2022 走看看