信号三表block,pending、handler

文章详细阐述了进程信号中的pending表、block表和handler表的作用,解释了信号从产生到递达的过程。pending表用于记录待处理的信号,block表用于阻塞信号,handler表则保存信号的处理方式。信号的执行通常在从内核态返回用户态时进行。此外,还介绍了操作系统如何通过内核处理系统调用和进程切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前序:

信号流程图:

pending表(信号未决表

block表(信号阻塞表

handler表(信号递达表

小知识点

1:handler保存的是什么


前序:

进程信号中的三大表格

首先在了解进程信号中的三大表格之前我们必须知道3个概念:
1、信号递达(Delivery):信号递达指的是进程实际执行信号的处理动作。
2、信号未决(pending):信号从产生到递达之间的状态。
3、阻塞(block):进程可以选择阻塞一个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对该信号的阻塞,才能执行递达的动作。

信号流程图:

信号的流程

pending表(信号未决表

这是一个位图,存在32位与64位图,我们用32位做讲解。也是个位图结构

信号写入pending表,将对应的位图(2号信号,第2位比特位)反转位为1。

<think>好的,我现在要回答用户关于阻塞信号和忽略信号区别的问题。首先,我需要回顾一下之前提供的引用内容,确保理解正确。 根据引用1,阻塞信号是指信号处于pending状态,内核检查信号队列时,如果信号被阻塞就不会处理。而引用3提到,阻塞信号通常是在关键代码块前使用sigprocmask来阻塞,之后处理未决信号。引用2和4则说明忽略信号可能涉及默认处理或自定义函数,比如SIG_IGN。 首先,我需要明确两者的定义。阻塞信号是暂时阻止信号被递送,但信号仍然存在队列中。而忽略信号是当信号递送时,进程直接丢弃它,不采取任何行动。 接下来,我需要比较它们的实现方式。阻塞通常通过信号掩码,如sigprocmask设置阻塞集合。而忽略是通过将信号的处理函数设置为SIG_IGN,或者使用sigaction结构体中的sa_handler。 然后,考虑生命周期。阻塞是临时的,通常在代码块结束后解除。忽略则是持久的,除非显式更改处理方式。 还要提到对子进程的影响,引用3指出子进程继承父进程的信号设置。所以阻塞和忽略的设置都可能被继承,但execv会重置忽略的设置? 另外,信号处理时机:阻塞的信号会在解除阻塞后递送,而忽略的信号直接被丢弃,不会进入队列。 可能用户还关心实际应用场景,比如阻塞用于保护关键代码,忽略用于避免某些信号的干扰。 需要确保回答结构清晰,分点说明区别,并引用相关参考资料。同时生成相关问题,比如如何设置阻塞或忽略,它们的应用场景等。</think>### 阻塞信号与忽略信号的区别 在Linux信号处理中,**阻塞信号**和**忽略信号**是两种不同的信号处理机制,主要区别体现在信号的生命周期、处理方式和应用场景上。 --- #### 1. **定义与处理时机** - **阻塞信号**(Blocking Signals) 通过信号掩码(Signal Mask)将指定信号标记为**暂不处理**。此时信号仍会进入内核的未决信号队列(Pending Queue),但暂时不会递送给进程。当信号解除阻塞后,内核才会检查并处理该信号[^1][^3]。 **示例代码**: ```c sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGINT); // 阻塞SIGINT信号 sigprocmask(SIG_BLOCK, &mask, NULL); // 设置信号掩码 ``` - **忽略信号**(Ignoring Signals) 进程主动告知内核**不处理**某个信号。当信号发生时,内核直接丢弃该信号,既不保留在队列中,也不触发任何动作(如终止进程或调用处理函数)[^2][^3]。 **示例代码**: ```c signal(SIGINT, SIG_IGN); // 忽略SIGINT信号 ``` --- #### 2. **信号的生命周期** - **阻塞信号**:信号仍存在于未决队列中,**等待解除阻塞后被处理**。例如,在关键代码段执行前阻塞信号,执行后恢复处理[^3]。 - **忽略信号**:信号直接被丢弃,**永远不会进入队列或触发处理**。 --- #### 3. **应用场景** - **阻塞信号**的典型场景: - 保护关键代码段(如修改共享数据)时,避免被信号中断[^3]。 - 在多线程编程中,控制信号递送的时机。 - **忽略信号**的典型场景: - 防止特定信号干扰进程(如忽略`SIGPIPE`防止因管道断开而终止进程)。 - 子进程继承父信号的忽略设置(但通过`execv`创建的子进程会重置信号处理方式)[^3]。 --- #### 4. **实现方式对比** | 特性 | 阻塞信号 | 忽略信号 | |--------------------|----------------------------|----------------------------| | **信号队列** | 信号保留在未决队列 | 信号直接被丢弃 | | **处理函数** | 可能触发自定义处理函数或默认行为 | 无任何处理行为 | | **设置方法** | `sigprocmask`或`sigsuspend` | `signal(SIGXXX, SIG_IGN)`或`sigaction`[^2][^4] | | **持久性** | 临时性(需手动解除) | 持久性(除非显式修改) | --- #### 5. **代码示例对比 **阻塞信号后解除**: ```c sigset_t mask, oldmask; sigemptyset(&mask); sigaddset(&mask, SIGINT); sigprocmask(SIG_BLOCK, &mask, &oldmask); // 阻塞SIGINT // 关键代码段... sigprocmask(SIG_SETMASK, &oldmask, NULL); // 解除阻塞 ``` **忽略信号**: ```c signal(SIGINT, SIG_IGN); // 忽略Ctrl+C信号 // 即使按下Ctrl+C,进程也不会终止 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云的小站

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

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

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

打赏作者

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

抵扣说明:

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

余额充值