【发布时间】:2019-08-06 07:46:03
【问题描述】:
目前我正在尝试创建一个信号处理程序,当它接收到 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 等还是很陌生,所以我对它在低级别的大部分工作方式非常不熟悉。
【问题讨论】:
-
你应该在编码之前阅读sigaction(2)。
man页面指的是signal(7),其中提到了signal-safety(7)。即使在 2019 年,RTFM 也是一个明智的格言。 -
如果问题是针对 QNX 的,那么应该在其中提及 QNX