【发布时间】:2021-12-18 18:51:53
【问题描述】:
我有以下问题:
我正在 main 中创建两个线程。这些线程永远不会停止(它们一直在监听消息)。
所以,在 main 中,创建这两个线程后,我有这个 sn-p 代码来保持程序运行:
for (;;)
{
sleep(10);
}
return 0;
它可以工作,但问题是当我在终端中执行程序时,Ctrl+C 不允许我退出程序。我必须用Ctrl+\ 退出。我有这个功能(不是我做的)。问题出在哪里?
void app_signal_handler(int sig_num)
{
if (sig_num == SIGINT) {
printf("SIGINT signal!\n");
}
if (sig_num == SIGTERM) {
printf("SIGTERM signal!\n");
}
app_running = false;
}
char app_sigaltstack[SIGSTKSZ];
int app_setup_signals(void)
{
stack_t sigstack;
struct sigaction sa;
int ret = -1;
sigstack.ss_sp = app_sigaltstack;
sigstack.ss_size = SIGSTKSZ;
sigstack.ss_flags = 0;
if (sigaltstack(&sigstack, NULL) == -1) {
perror("signalstack()");
goto END;
}
sa.sa_handler = app_signal_handler;
sa.sa_flags = SA_ONSTACK;
if (sigaction(SIGINT, &sa, 0) != 0) {
perror("sigaction()");
goto END;
}
if (sigaction(SIGTERM, &sa, 0) != 0) {
perror("sigaction()");
goto END;
}
ret = 0;
END:
return ret;
}
【问题讨论】:
-
请提供minimal reproducible example。
app_running如何在代码的其他地方使用(如果有的话)? -
当你按下Ctrl+C时,你的程序会显示什么吗?
-
你的
for循环不应该是for(;app_running;)? -
另请注意,在信号处理程序中调用
printf严格来说是非法,尽管许多平台都支持它。 -
for(;app_running;) 这就是答案!非常感谢!