You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于sigsuspend是否触发未决信号处理的技术疑问

关于sigsuspend处理未决信号的疑问

sigsuspend是一个会修改信号掩码并挂起进程直至新信号递送的函数。我发现一个现象:当进程处于sleep状态(5秒)时,按下ctrl-z产生的SIGTSTP因被掩码拦截不会触发处理函数,但在调用sigsuspend后,该未决信号自动被递送并触发处理。想确认:sigsuspend是否确实会处理未决信号?

代码示例

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

void handlerSIGTSTP()
{
    printf("I have recieved the signal \n");
}

int main()
{
    
    sigset_t mask;
    sigset_t ancien;
    signal(SIGTSTP,handlerSIGTSTP);
    sigaddset(&mask,SIGTSTP);
    sigprocmask(SIG_SETMASK,&mask,&ancien);
    printf("J'entre en sleep\n");
    sleep(5);
    printf("J'entre en suspend\n");
    sigsuspend(&ancien);    
}

执行结果

J'entre en sleep
^ZJ'entre en suspend
J'ai recu le signal maintenant

是的,sigsuspend确实会处理未决信号。

当你通过sigprocmask将SIGTSTP加入信号掩码后,进程收到该信号时会将其标记为未决状态,不会立即触发处理函数。

调用sigsuspend(&ancien)时,会执行两个关键操作:

  • 临时将进程的信号掩码替换为ancien(这里ancien是设置掩码前的原始状态,不包含SIGTSTP)
  • 挂起进程,等待信号递送

此时,之前处于未决状态的SIGTSTP不再被掩码阻挡,会立即被递送并触发对应的处理函数。处理完成后,sigsuspend才会返回(如果信号的处理方式是终止进程则直接结束)。

你的代码和执行结果正好验证了这一点:sleep期间收到的SIGTSTP被掩码拦截,直到sigsuspend切换回原始掩码后,未决信号才被处理。


内容的提问来源于stack exchange,提问作者SBAT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:20:35