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.
我认为这意味着默认情况下,SIGINT
的 SIG_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
。
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.
我认为这意味着默认情况下,SIGINT
的 SIG_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
。