【Linux】阻塞信号

LInux中信号产生的原因大致有一下三种:

  1. 键盘中断
  2. 命令发出
  3. 异常产生中断

但归根结底,这些信号其实都是最终有操作系统发出的。

常见的对信号的处理,无外乎以下三种:

  1. 忽略
  2. 终止该进程
  3. 自定义行为

对信号的处理动作叫做信号递达,在信号由产生到递达的过程中还有一种状态叫做未决。即信号虽产生,但是未被处理。这个时候就需要将信号保存起来。

信号的种类:

         

其中,前31个信号属于普通信号,后31个属于实时信号,这里不讨论实时信号。

普通信号有31个,足以用一个4字节的变量来保存。于是就有了block(阻塞)表和pending(未决)表。

其中task_struct,就是LInux中的PCB的名称。在PCB中维护了三张表,分别是block,pending, handler表,block表示哪一个信号被阻塞,它的下标的值加1代表对应被阻塞的信号。pending表表示哪个信号处于未决状态,表示方法同block,横向看过去handler,分别代表捕获到该信号时的处理方式。

下面利用一小段程序来测试打印一下pending表:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void printsigset(sigset_t *set)
{
	int i = 0;
	for (; i < 32; ++i)
	{
		if (sigismember(set, i)) //查看信号i对应的位是否为被置1
		{
			putchar('1');
		}
		else
		{
			putchar('0');
		}
	}
	puts("");
}

int main()
{
	sigset_t s, p;
	sigemptyset(&s); //初始化:0
	sigemptyset(&p);
	sigaddset(&s, SIGINT);
	sigprocmask(SIG_BLOCK, &s, NULL);

	while (1)
	{
		sigpending(&p);
		printsigset(&p);
		sleep(1);
	}

	return 0;
}


初始时输出如下:

                    

现在有一个信号1处于未决状态,当按下键盘上的CtrlC时,将会产生一个2信号给该进程,对应的位会被置1:

                   

知道解除阻塞,这个信号才会在恰当的时候被处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fireplusplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值