信号阻塞/文件描述符阻塞

本文详细介绍了信号阻塞和文件描述符阻塞的概念。信号阻塞时,信号不会被递达,而是保留在未决信号集中。未决信号集和阻塞信号集是两个关键概念,它们之间的关系决定了信号处理的流程。文件描述符阻塞分为阻塞和非阻塞模式,阻塞模式下,调用会挂起线程直至有数据可用,而非阻塞模式则会立即返回当前状态,可能需要循环检查才能获取数据。
摘要由CSDN通过智能技术生成

信号阻塞

  • 信号递达(Delivery):实际执行信号的处理动作。

  • 信号未决(pending):信号从产生到递达之间的状态。

  • 信号阻塞(block):产生信号,信号也不会被递达。被阻塞的信号产生时将保持在未决状态,信号被阻塞了就不被递达。

未决信号集和阻塞信号集

未决信号集:
    信号产生后由于某些原因(主要是阻塞)不能抵达,这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态;若是信号从阻塞信号集中解除阻塞,则该信号会被处理,并从未决信号集中去除。

阻塞信号集:
    阻塞信号集中保存的都是被当前进程阻塞的信号。若当前进程收到的是阻塞信号集中的某些信号,这些信号需要暂时被阻塞,不予处理。

二者之间的关系:
    阻塞信号集是由程序员自己事先注册信号,然后使用sigprocmask()将需要阻塞的信号加入到阻塞信号集中。程序可以产生注册过的信号,然后这些信号会被阻塞到未决信号集中;程序也可以产生未注册的信号,然后通过未决信号集,触发信号处理函数或默认处理。
    未决信号集 是程序产生信号之后,信号保留的地方。当信号到达未决信号集之后,先在阻塞信号集中查看对应的信号是否阻塞(对应的标识位为 1),若阻塞:则保留在未决信号集中–>该信号位对应的标识位 始终为 1;若不阻塞:则处理未决信号集中的信号(信号处理函数或默认处理),然后该标识位由 1---->0,标识 该信号已经被处理(这就是递达状态
    所以即使多次触发存在于阻塞信号集中的 信号,在解除阻塞之后,该信号只会被触发一次。

	#include<stdio.h>
	#include<stdlib.h>
	#include<string.h>
	#include<sys/types.h>
	#include<fcntl.h>
	#include<signal.h>
	#include<unistd.h>

	void sighandler(int signo){
   
		printf("signo == [%d]\n", signo);
	}
	int main(){
   
		signal(SIGINT, sighandler);
		signal(SIGQUIT, sighandler);

		sigset_t set;
		sigset_t oldset;
		sigemptyset(&set);
		
		sigaddset(&set, SIGINT);
		sigaddset(&set, SIGQUIT);

		sigprocmask(SIG_BLOCK, &set, &oldset);
		sigset_t pend;
		int j = 1;
		while(1){
   
			sigemptyset(&pend);
			sigpending(&pend);
			for(int i =0 ; i < 32; i++){
   
				if(sigismember(&pend, i) == 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值