gpt4 book ai didi

linux - 未传递的待处理信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:01 24 4
gpt4 key购买 nike

我编写这个程序来检查 SIGQUIT 信号的阻塞。问题是在恢复到之前的状态后,信号处于待处理状态,但未被传送。

这是主程序

sigset_t newmask, oldmask, pendmask;
if(signal(SIGQUIT,sig_quit)==SIG_ERR) //Register signal handler
printf("\nerror\n");
sigemptyset(&newmask);
sigaddset(&newmask,SIGQUIT);
sigprocmask(SIG_BLOCK,&newmask,&oldmask); //Save previous value and block SIGQUIT
sleep(5);
sigpending(&pendmask);
if(sigismember(&pendmask,SIGQUIT)){ //Check if SIGQUIT is pending
printf("\nSIGQUIT pending..\n");
fflush(stdout);
}
sigprocmask(SIG_BLOCK,&oldmask,NULL); //Restore old value of sigset
printf("\nSIGQUIT unblocked\n");
fflush(stdout);
sleep(5); //Sleep again to check if everything is A-okay!

我能理解在第一个 sleep 中信号被屏蔽了。但是即使在解除阻塞之后,在第二个 sleep 函数中,程序也没有响应 SIGQUIT。

这可能是什么问题?

P.S 我用的是 CentOs

这是处理函数

void sig_quit(int i)
{
printf("\nSIGQUIT caught\n");
fflush(stdout);
signal(SIGQUIT,SIG_DFL);
}

最佳答案

那是因为当你认为你是:

sigprocmask(SIG_BLOCK,&oldmask,NULL);   //Restore old value of sigset

使用SIG_BLOCKsigprocmask正在将 oldmask 添加到当前被阻止的信号中。

改为尝试:

sigprocmask(SIG_SETMASK,&oldmask,NULL);   //Restore old value of sigset

此外,在 sig_quit 中,您使用的 printf 不是 async-signal-safe功能。例如,您可以改用 write

关于linux - 未传递的待处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26903379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com