【问题标题】:Are signal handlers meant to run indefinitely?信号处理程序是否意味着无限期运行?
【发布时间】:2016-12-11 21:34:58
【问题描述】:
#include <iostream>
#include <csignal>

void handler(int signo){
    std::cout << "Caught " << (signo == SIGINT) << std::endl;
}

int main(){
    signal(SIGINT, handler);
    while(true) ;

}

在 Windows 和 Linux 上,当我按 Cntrl+C multiple 次时,它们似乎做了两种不同的事情。在 Linux 上我会多次看到被捕获的消息,而在 Windows 上我会看到一次被捕获的消息,并且在第二次按下 Cntrl+C 时,我的程序将关闭。那么处理程序是只捕获一次信号,还是无限期地捕获信号?或者是否有我缺少的 Windows 属性导致程序在第二次按下时关闭?

As far as I can tell Cntrl+C 在 Windows 上被视为 SIGINT,就像在 Linux 上一样。

【问题讨论】:

  • @latedeveloper 谢谢,我正在查看未提及的 cppreference.com 文档。相关行:“在执行指定函数之前,将func的值设置为SIG_DFL
  • 另请注意,在 Windows 上,SIGINT 处理程序在单独的线程中运行。
  • @HarryJohnston 这是否意味着不必担心在 Windows 上的信号处理程序中使用“安全”函数,就像在 Linux 上一样? man7.org/linux/man-pages/man7/signal.7.html
  • @SergeantPenguin:仅适用于 SIGINT,我不确定是否所有 C 运行时库函数都是线程安全的。

标签: c++ linux windows signals


【解决方案1】:

这取决于signal 的实现,它可能等同于sigaction 设置或清除SA_RESETHAND 标志——根据POSIX 和C 标准,这两种方法都是可接受的。

如果您想控制这种行为,您需要使用sigaction 而不是signal 来设置信号处理程序并设置标志以获得所需的行为。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2019-05-28
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多