狂自私

导航

把所有常规信号的未决状态打印至屏幕

信号未决状态,说的实际是未决信号集。即我们要打印输出未决信号集到屏幕上。在此之前,先看看信号集操作函数

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

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);    成功:0;失败:-1,设置error     作用:用来屏蔽信号、解除屏蔽也使用该函数。严格注意,屏蔽信号:只是将信号处理延后执行(延至解除屏蔽);而忽略表示将信号丢处理。

参数:

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

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

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

SIG_BLOCK: 当how设置为此值,set表示需要屏蔽的信号。相当于 mask = mask|set

SIG_UNBLOCK: 当how设置为此,set表示需要解除屏蔽的信号。相当于 mask = mask & ~set

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

int sigpending(sigset_t *set);读取当前进程的未决信号集;set是传出参数。   返回值:成功:0;失败:-1,设置error

上代码吧;

#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

void printset(sigset_t *ped)

{

    int i;

    for (i = 1; i < 32; i++) {

        if ((sigismember(ped, i) == 1)) {

            putchar('1');

        }

        else {

            putchar('0');

        }

    }

    printf("\n");

}

int main(void)

{

    sigset_t set, ped;

    sigemptyset(&set);

    /*

    Ctrl + c → 2) SIGINT(终止/中断) "INT" —-Interrupt

    Ctrl + z → 20) SIGTSTP(暂停/停止) "T" —-Terminal 终端。

    Ctrl + \ → 3) SIGQUIT(退出)

    */

    sigaddset(&set, SIGINT);

    sigaddset(&set, SIGTSTP);

    sigaddset(&set, SIGQUIT);

    sigaddset(&set, SIGKILL);//这是9号信号,是不能被屏蔽、捕捉的,写在这里是为了证实,还有19号信号也是。

    sigfillset(&set);

    sigprocmask(SIG_BLOCK, &set, NULL); //不获取原屏蔽字(阻塞信号集)

    while (1) {

        sigpending(&ped); //获取未决信号集

        printset(&ped);

        sleep(1);

    }

    return 0;

}

结果:因为ctrl+c不能结束程序,我们在另一个终端中用kill杀死进程:,结果:

posted on 2018-04-05 20:47  狂自私  阅读(157)  评论(0编辑  收藏  举报