规格说:
任何 Win32 应用程序都不支持 SIGINT。当 CTRL+C 中断发生时,Win32 操作系统会生成一个新线程来专门处理该中断。这可能会导致单线程应用程序(例如 UNIX 中的应用程序)变成多线程并导致意外行为。
我认为这意味着默认情况下,
SIG_DFL
的处理程序将创建一个新线程,处理信号然后终止程序。我想知道,Windows 是否支持用户定义的 SIGINT
处理程序,或者如果发生 CTRL+C 中断,操作系统会忽略处理程序并且默认的 SIGINT
处理程序将运行吗?例如下面的代码会打印SIG_DFL
吗?
Signaled!
#include <signal.h>
#include <stdio.h>
volatile sig_atomic_t signaled = 0;
void signal_handler(int) { signaled = 1; }
int main() {
signal(SIGINT, signal_handler);
while (!signaled) {}
printf("Signaled!\n");
}
,但有一些注意事项:
它是从另一个线程(由操作系统创建)触发的,来代替。另请参阅 Windows
SetConsoleCtrlHandler
文档中的此说明
:任何 Win32 应用程序都不支持
signal
。当 CTRL+C 中断发生时,Win32 操作系统会生成一个新线程来专门处理该中断。这可能会导致单线程应用程序(例如 UNIX 中的应用程序)变成多线程并导致意外行为。