gpt4 book ai didi

c - SigHandler 导致程序无法终止

转载 作者:行者123 更新时间:2023-11-30 18:21:11 24 4
gpt4 key购买 nike

目前我正在尝试创建一个信号处理程序,当它收到 SIGTERM 信号时,它会关闭打开的网络套接字和文件描述符。

这是我的 SigHandler 函数

static void SigHandler(int signo){
if(signo == SIGTERM){
log_trace("SIGTERM received - handling signal");
CloseSockets();
log_trace("SIGTERM received - All sockets closed");

if (closeFile() == -1)
log_trace("SIGTERM received - No File associated with XXX open - continuing with shutdown");
else
log_trace("SIGTERM received - Closed File Descriptor for XXX - continuing with shutdown");

log_trace("Gracefully shutting down XXX Service");
} else {
log_trace("%d received - incompatible signal");
return;
}

exit(0);
}

下面的代码位于 main 中

if (sigemptyset(&set) == SIGEMPTYSET_ERROR){
log_error("Signal handling initialization failed");
}
else {
if(sigaddset(&set, SIGTERM) == SIGADDSET_ERROR) {
log_error("Signal SIGTERM not valid");
}
action.sa_flags = 0;
action.sa_mask = set;
action.sa_handler = &SigHandler;
if (sigaction(SIGTERM, &action, NULL) == SIGACTION_ERROR) {
log_error("SIGTERM handler initialization error");
}
}

当我发送kill -15 PID时,没有任何反应。该进程不会终止,也不会成为僵尸进程(无论如何也不应该终止)。不过,我确实看到了 SigHandler 函数中打印的痕迹,所以我知道它已经达到了代码中的那个点。似乎当涉及到 exit(0) 时,这不起作用。

当我发送 SIGKILL (kill -9 PID) 时,它会很好地终止进程。

如果这含糊不清,我很抱歉,我对 C 和 UNIX 等还很陌生,所以我对它在低级别上的大部分工作方式非常不熟悉。

最佳答案

您的信号处理程序例程在概念上是错误的(它不仅仅使用异步信号安全函数)。仔细阅读 signal(7)signal-safety(7)了解原因。并且您的处理程序可能显然在大部分时间都可以工作,但仍然是 undefined behavior .

通常的技巧是(在信号处理程序中)设置一些 volatile sig_atomic_t变量并在信号处理程序之外测试该变量。另一个可能的技巧是 pipe(7) self 欺骗(Qt文档很好地解释了it),您的信号处理程序只需执行write(2) (这是异步信号安全的)到某些全局 file descriptor通过例如获得pipe(2) (或者可能是 Linux 特定的 eventfd(2) ...)在安装该信号处理程序之前进行程序初始化。

Linux 特定的方法是使用 signalfd(2)对于 SIGTERM 并在您自己的 event loop 中处理它(基于 poll(2) )。从概念上讲,这个技巧是管道到自身的一种变体。但是 signalfd 有一些缺点,网络搜索很容易找到你。

信号在概念上很难使用(有些人认为它们是 Unix 中的设计错误),尤其是在多线程程序中。

您可能想阅读旧的 ALP书。它有一些与您的问题相关的很好的解释。

PS。如果您的系统是 QNX,您应该阅读它的文档。

关于c - SigHandler 导致程序无法终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55179050/

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