gpt4 book ai didi

linux - 使用 sigprocmask 设置掩码仅取决于调用位置

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:54 24 4
gpt4 key购买 nike

我有一个奇怪的行为,联机帮助页和谷歌没有帮助。

在我的代码中,我想在发送 SIGUSR2 时阻止/取消阻止 SIGINT。为此,我安装了信号处理程序并在函数中准备了掩码集:

void installSignallHandler(){

sBlock.sa_handler = handleBlock;
sigemptyset(&sBlock.sa_mask);
sigaddset(&sBlock.sa_mask, SIGUSR2);
sBlock.sa_flags = 0;
sigaction(SIGUSR2, &sBlock, NULL);

sigemptyset(&signals_protected);
sigaddset(&signals_protected, SIGINT);

// For some reason sigprocmask only works if it is called here the first time
// sigprocmask(SIG_BLOCK, &signals_protected, NULL);
// sigintBlocked = true;
}

然后如果 SIGUSR2 被发送,这个函数被调用:

void handleBlock(int signal){
if(sigintBlocked){
printf("Unblocking SIGINT ...\n");
sigprocmask(SIG_UNBLOCK, &signals_protected, NULL);
sigintBlocked = false;
}
else{
printf("Blocking SIGINT ...\n");
sigprocmask(SIG_BLOCK, &signals_protected, NULL);
sigintBlocked = true;
}
}

为了测试,我这样调用它:

int main(int argc, char **argv) {
installSignallHandler();
while(1){
printf("processing...\n");
sleep(1);
}
return EXIT_SUCCESS;
}

现在的问题是:按照我发布代码的方式,sigprocmask 无效。但是,如果我取消注释上面的两行,它就会起作用。所以我的两个问题:

  1. 你能解释一下这种行为吗?
  2. 我能做些什么来解决它? - 我不想从信号受阻开始。

最佳答案

因为它是竞争条件。在 sig_handler 中设置 sigintBlocked,然后在主函数中进行验证(如果已设置),然后屏蔽信号。

此链接有更多信息 sigprocmask during signal's execution

关于linux - 使用 sigprocmask 设置掩码仅取决于调用位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23273265/

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