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

问题描述 投票:0回答:1

规格说:

任何 Win32 应用程序都不支持 SIGINT。当 CTRL+C 中断发生时,Win32 操作系统会生成一个新线程来专门处理该中断。这可能会导致单线程应用程序(例如 UNIX 中的应用程序)变成多线程并导致意外行为。

我认为这意味着默认情况下,

SIG_DFL
的处理程序将创建一个新线程,处理信号然后终止程序。我想知道,Windows 是否支持用户定义的
SIGINT
处理程序,或者如果发生 CTRL+C 中断,操作系统会忽略处理程序并且默认的
SIGINT
处理程序将运行吗?
例如下面的代码会打印

SIG_DFL

吗?

Signaled!

	
c++ c winapi signals ipc
1个回答
1
投票
#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 本机

SIGINT

 来代替。
另请参阅 Windows

SetConsoleCtrlHandler 文档中的此说明

任何 Win32 应用程序都不支持

signal。当 CTRL+C 中断发生时,Win32 操作系统会生成一个新线程来专门处理该中断。这可能会导致单线程应用程序(例如 UNIX 中的应用程序)变成多线程并导致意外行为。



    

© www.soinside.com 2019 - 2024. All rights reserved.