linux sigprocmask的问题

问题描述

linux sigprocmask的问题

学习sigprocmask,发现sigpromask有时返回的oset是调用sigprocmask前信号的屏蔽集(截图中的“程序启动时”),有时返回的oset又是调用sigprocmask后信号屏蔽集(截图中的“收到SIGUSR2信号”)。

APUE是如下图说的。到底改如何理解这个oset呢?

程序运行解图:

程序代码:

为了方便各位大神测试,贴出代码:

#include
#include
#include
#include
#include

void printsigset(sigset_t *set) //打印信号集中的各个位
{
int i;
for(i=1;i<NSIG;i++)
{
if(sigismember(set,i)) putchar('1');
else putchar('0');
}
printf("
");
}

void handle_sigusr2(int sig)
{
sigset_t set,oset; //添加新的阻塞信号SIGUSR2,并打印出当前信号屏蔽字oset
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,SIGUSR2);
sigprocmask(SIG_BLOCK,&set,&oset);

printsigset(&oset);
}

int main(void)
{
signal(SIGUSR2,handle_sigusr2);//添加新的阻塞信号SIGUSR1,并打印出当前信号屏蔽字oset
sigset_t set,oset;
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,SIGUSR1);
sigprocmask(SIG_BLOCK,&set,&oset);
printsigset(&oset);
for(;;) pause();
return 0;
}

解决方案

If oldset is non-null, the previous value of the signal mask is stored in oldset.

你调用一次那个函数,确实设置了屏蔽字。不过oset那里返回的是之前的信号屏蔽字。。。

你再调用一次sigprocmask(0,NULL,&oset)就可以看到当前设置的信号屏蔽字了

解决方案二:

(转)Linux sigprocmask
linux 信号量sigprocmask使用

解决方案三:

man 一下sigprocmask,发现是这样描述---- If oldset is non-NULL, the previous value of the signal mask is stored
in oldset.

可见,oset指阿是之前的信号屏蔽字。既然如此,为何接到SIGURS2后oset返回有两个1呢?

时间: 2024-08-01 19:41:10

linux sigprocmask的问题的相关文章

用 GDB 排查 Python 程序故障

某Team在用Python开发一些代码,涉及子进程以及设法消除僵尸进程的需求.实践中他们碰上Python程序非预期退出的现象.最初他们决定 用GDB调试Python解释器,查看exit()的源头.我听了之后,觉得这个问题应该用别的调试思路.帮他们排查这次程序故障时,除去原始问题,还衍 生了其他问题. 这次的问题相比西安研发中心曾经碰上的Python信号处理问题,有不少基础知识.先验知识是共用的,此处不做再普及,感兴趣的同学可以翻看我以前发过的文章. 下文是一次具体的调试.分析记录.为了简化现场.

Linux下C编程:sigprocmask阻塞进程

1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2.信号阻塞和忽略信号的区别. 阻塞的概念和忽略信号是不同的.操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递.当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃. 3.信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的. #include <signal.h> int

linux c之sigsuspend 进程阻塞

函数原型: #include <signal.h> int sigsuspend(const sigset_t *mask); 作用: 用于在接收到某个信号之前,临时用mask替换进程的信号掩码,并暂停进程执行,直到收到信号为止. The sigsuspend() function replaces the current signal mask of the calling thread with the set of signals pointed to by sigmask and th

Linux下C编程:sigsuspend执行过程分析

用于在接受到某个信号之前,临时用mask替换进程的信号掩码,并暂停进程执行,直到收到信号为止. /*The sigsuspend() function replaces the current signal mask of the calling thread with the set of signals pointed to by sigmask and then suspends the thread until delivery of a signal whose action is e

Linux下实时定时器在C语言中的实现和应用

linux下还有一种高精度的定时器,那就是posix_timer.我记得以前看代码的时候CLOCK_REALTIME的定时器似乎用的就是rdtsc指令,不过现在不确定了,先放到一边.原理上来说,可以在变频的时候也使用rdtsc指令,因为CPU的频率我们也是知道的,变频的时候内核也是知道的. 下面是我的timer_create的例子,编译的时候要加上rt库,这是linux的realtime库: gcc -o test test.c #include <stdio.h> #include <

linux线程pthread_create的源码分析

int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr, void * (*start_routine)(void *), void *arg) // thread 为pthread_t,实则是pthread指针. // typedef struct pthread *pthread_t; ->unsigned long int // attr 创建线程时的附加属性 // start_routine 执行的线程

Linux中system函数的实现

#include <errno.h> #include <signal.h> #include <unistd.h> int system(const char *cmdstring) /* with appropriate signal handling */ { pid_t pid; int status; struct sigaction ignore, saveintr, savequit; sigset_t chldmask, savemask; if (cm

Linux系统调用详解(实现机制分析)--linux内核剖析(六)

系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制.也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call).在linux中系统调用是用户空间访问内核的唯一手段,除异常和陷入外,他们是内核唯一的合法入口. 一般情况下应用程序通过应用编程接口API,而不是直接通过系统调用来编程.在Unix世界,最流行的API

Linux信号(signal) 机制分析(1)

[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等.最后介绍了应用层的相关处理,主要包括信号处理函数的安装.信号的发送.屏蔽阻塞等,最后给了几个简单的应用实例. [关键字]软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t 1. 信号本质 软