Windows 应用是否支持用户定义的信号处理程序的 SIGINT?

Do Windows apps support SIGINT for user-defined signal handlers?

specs 说:

SIGINT is not supported for any Win32 application. When a CTRL+C interrupt occurs, Win32 operating systems generate a new thread to specifically handle that interrupt. This can cause a single-thread application, such as one in UNIX, to become multithreaded and cause unexpected behavior.

我认为这意味着默认情况下,SIGINTSIG_DFL 处理程序将创建一个新线程,处理信号然后终止程序。我想知道,Windows 是否支持用户定义的 SIGINT 处理程序,或者 OS 会忽略处理程序,而默认 SIG_DFL 处理程序会 运行 如果出现CTRL+C中断?

例如,下面的代码会打印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");
}

实际上 Win32 会在 Ctrl-C 上触发 SIGINT,但有几点需要注意:

  • 它是从另一个线程触发的,
  • 每次命中后需要re-armed。

第二个项目符号引入了竞争条件,因此最好改用 Win32 本机 SetConsoleCtrlHandler