为什么当我按 CTRL+C 时 mingw-w64 mintty 不向我的程序发出信号()?

Why does mingw-w64 mintty not signal() my program when I CTRL+C?

当我按下 CTRL+C 时,MinTTY 似乎没有向我的 mingw-w64 程序发出信号。在具有相同相同程序的 CMD 中,信号 正确发出。这是为什么?

程序是在msys2 mingw-w64下用g++ -static -static-libstdc++ -std=c++14 -Wall -Wextra -pedantic testan.cpp编译的。在这两种情况下,signal() 都没有 return SIG_ERR 因此处理程序似乎已正确安装。


代码:

#include <chrono>
#include <thread>
#include <iostream>
#include <csignal>
using namespace std;

void signalHandler( int x ) {
    cout << "Interrupt: " << x << endl;
    exit( 123 );
}

int main () {
    if( signal(SIGINT, signalHandler) == SIG_ERR )
        cout << "received SIG_ERR" << endl;

    while( true ) {
        cout << "waiting for CTRL+C" << endl;
        this_thread::sleep_for( 1s );
    }

    return 0;
}

mintty 输出:

$ ./a.exe
waiting for CTRL+C
waiting for CTRL+C
waiting for CTRL+C

$

命令输出:

C:\Users\Xunie\Desktop\project>a.exe
waiting for CTRL+C
waiting for CTRL+C
Interrupt: 2

C:\Users\Xunie\Desktop\project>

MinTTY 是面向 POSIX 的终端仿真器,它使用 Cygwin/MSYS2 PTYs,不能很好地与本机(非 Cygwin 非 MSYS2)程序交互。这包括信号、交互式输入的检测等 MinTTY doesn't attempt to fix this,但 Cygwin 最近(自 v3.1.0 起)通过使用新的 ConPTY API 改进了对此用例的支持。截至 2020 年 5 月,MSYS2 尚未将这些更改集成到其运行时中,因此您还看不到其中的好处。同时(以及旧的 Windows 版本),您可以使用 winpty 包装器,可使用 pacman 安装。