狂自私

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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

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

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   狂自私  阅读(159)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示