【发布时间】: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 运行时库函数都是线程安全的。