gpt4 book ai didi

c - 使用 sigwait 处理 SIGQUIT

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:33 26 4
gpt4 key购买 nike

我正在编写一个需要用以下 bash 行终止的多线程程序:

killall -QUIT -w procname

我决定使用一个线程来接收一些我需要处理的信号,比如 SIGQUIT 和 SIGUSR1,而忽略其他信号中的 SIGQUIT。要忽略我写的信号:

struct sigaction s;
s.sa_handler=SIG_IGN;
if((sigaction(SIGQUIT,&s,NULL))==-1) {
perror("sigaction");
return -1;
}

并且我在指定等待信号的线程中写了如下代码(handlerrno是检查errno并退出的函数):

sigset_t threadset;
int err, sig;
if(sigfillset(&threadset)==-1) handlerrno("Sigfillset thread stats");
if(sigdelset(&threadset,SIGQUIT)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGINT)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGTERM)==-1) handlerrno("Sigdelset thread stats");
if(sigdelset(&threadset,SIGUSR1)==-1) handlerrno("Sigdelset thread stats");
if((err=pthread_sigmask(SIG_SETMASK,&threadset,NULL))!=0)
handlerror(err,"Set sigmask thread stats");
if((err=sigwait(&threadset,&sig))!=0) handlerror(err,"Sigwait");
//I handle the signals here

但是,当我从 shell 启动 SIGQUIT 时,指定等待信号的线程似乎卡在了 sigwait() 中,所以我真的不知道发生了什么以及哪个线程获得了信号。代码有什么问题吗?谢谢!

最佳答案

忽略掩码是进程范围的。在 sigaction 调用之后,SIQUIT 将永远不会在任何线程中挂起,因此 sigwait 将永远阻塞。

您应该做的是在创建任何线程之前阻塞主线程中的信号,以便子线程也阻塞它 (child threads inherit the signal mask of their parent thread)。

尽管信号被阻塞,处理线程应该能够使信号出队。

(我不确定你选择的终止信号是否合适。SIQUIT 通常通过 Ctrl+\ 发送,预计会在之前创建核心转储终止。也许 SIGTERM 会是更好的选择。)

关于c - 使用 sigwait 处理 SIGQUIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45507747/

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