关于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
相关产品推荐
相关产品推荐

