gpt4 book ai didi

c - SIGTERM 信号处理程序未打印到控制台

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

我正在 try catch SIGTERM 信号并在来自 Linux 守护进程的处理程序中打印一条消息:

void SigStop_Handler(int sig)
{
D(printf("****************** HANDLED STOP SIGNAL ******************\n"));
printf("\n");
}

int main(int argc, char *argv[])
{
signal(SIGTERM, SigStop_Handler);

while(true)
{
//do something
}

return 0;
}

程序作为守护进程运行,从命令行启动:

systemctl start abc

deameon 将被停止:

systemctl stop abc

当守护进程停止时,我预计消息会打印在控制台上。然而,消息没有被打印出来,命令行也没有返回到命令提示符。它确实在一段时间后返回(超时)。守护进程将停止,但不会打印消息。

我做错了什么?

最佳答案

需要考虑两件事:在收到信号时终止守护进程,并获取消息。

在 systemctl 的上下文中,您希望信号处理程序退出程序。否则,它只会“打印”消息消息,然后继续处理。尝试

void SigStop_Handler(int sig)
{
D(fprintf(stderr, "****************** HANDLED STOP SIGNAL ******************\n"));
printf("\n");
exit(sig+128) ;
}

此外,假设进程作为守护进程运行,stdout 将不会连接到终端。相反,它将被重定向到日志文件中。此外,建议使用 stderr 发送消息,而不是 stdout(参见上面的代码)。另外,查看服务的 StandardOutputStandardErrro 配置条目。

您当前观察到的延迟发生是因为“systemctl”在发送 TERM 信号后等待几秒钟 - 使守护程序更改终​​止。如果守护进程没有主动终止,将发送 KILL 信号,这将强制守护进程立即无条件终止。

关于c - SIGTERM 信号处理程序未打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58442615/

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