进程信号的未决状态(pending status)

本文介绍了进程信号中未决状态的概念,即信号产生但尚未传递给进程的状态。当进程对某个信号进行阻塞时,该信号会变为未决状态。通过举例说明,解释了如何通过sigpending()检查未决信号,并讨论了信号处理函数在解除阻塞后的执行情况。

这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵。一开始当我看到这个词,我不理解,什么意思呢,读了好几遍。不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白。后来看到后面的例子,然后再回想一下,终于清楚了!下面记录一下吧。

定义:信号产生和传递之间的时间间隔内,称此信号是未决的;

简单的说就是:一个已经产生的信号,但是还没有传递给任何进程,此时该信号的状态就称为未决状态。

未决状态信号的产生主要是因为进程对此信号的阻塞。例如为进程产生一个选择为阻塞的信号,而且对该信号的动作是系统默认动作或捕捉该信号,则为该进程将此信号保持为未决状态,直到该进程对此信号解除了阻塞或者对此信号的动作改为忽略。

我们知道,进程的信号屏蔽字规定了要阻塞传送到该进程的信号集。当产生了一个该进程已阻塞的信号,系统会为该进程生成一个信号集(其实该信号集是一直存在的,不是产生阻塞信号时才生成的),并将该阻塞的信号保存在此信号集中即将此信号集对应的信号置为未决状态。可以通过调用sigpending()来返回该信号集。

下面看一个apue上的例子:

#include <stdio.h>

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

//信号处理函数
static void sig_quit(int sigo)
{
        printf("caught SIGQUIT...\n");
        //将SIGQUIT信号的处理方式恢复成系统默认的处理动作
        if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
                printf("can't reset SIGQUIT");
}
int main()
{
        sigset_t newmask, oldmask, pendmask;

        //定义对信号SIGQUIT的捕捉
  
### 含义 在查看 Linux 后台程序时,pending 状态有不同层面的含义。从信号角度来看,pending 表是存储信号未决状态的一种位图结构,当进程接收到信号后,操作系统只是将 pending 表的数据修改,表示信号处于未决状态,即信号已产生但还未被进程处理。如果进程不打算处理这个信号pending 表的信息会一直保留,直到进程处理这个信号,该信号对应的 pending 才会被置 0。例如 SIGHUP 信号,若其在 pending 表中对应的比特位为 0,则未处于未决状态信号不会递达;若 pending 为 1,且其阻塞字为 0,信号会被递达,即执行 handler 表中对应下标的方法 SIG_DFL(默认)[^1]。 从 Pod 层面来讲,Pod 的 pending 阶段表示 Pod 处于等待状态,可能是调度出现了问题等,对应的细分状态如 Unschedulable 就意味着 Pod 调度出现了问题,它还未分配到足够的资源以进入运行状态等[^2]。 ### 产生原因 - **信号层面**:进程信号是异步的,当信号产生时,进程可能正在执行其他重要任务,无法立即处理该信号,所以信号会先处于 pending 状态。例如,进程正在进行大量的计算任务,无法及时响应某个信号,该信号就会在 pending 表中标记为未决状态[^1]。 - **Pod 层面**:Pod 处于 pending 状态可能是因为资源不足,如没有足够的 CPU、内存等资源可供分配;或者是调度器无法找到合适的节点来运行 Pod,例如节点的亲和性、反亲和性设置不符合要求等[^2]。 ### 处理方法 - **信号层面**:可以通过修改信号的处理方式,即修改 handler 表中对应信号的处理方法,来让进程及时处理处于 pending 状态信号。例如,使用系统调用 `signal()` 或 `sigaction()` 来设置信号的处理函数,当信号递达时,执行相应的处理逻辑。示例代码如下: ```c #include <signal.h> #include <stdio.h> void signal_handler(int signum) { printf("Received signal %d\n", signum); } int main() { // 设置信号处理函数 signal(SIGHUP, signal_handler); while (1) { // 主循环 } return 0; } ``` - **Pod 层面**:如果是资源不足导致 Pod 处于 pending 状态,可以通过增加集群的资源,如添加节点、增加节点的资源配置等方式来解决。如果是调度问题,可以检查 Pod 的调度规则、节点的标签等,确保 Pod 能够被正确调度到合适的节点上。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值