Почему mingw-w64 mintty не сигнализирует () моей программе, когда я нажимаю CTRL+C?

MinTTY, похоже, не передает сигнал моей программе mingw-w64, когда я нажимаю CTRL+C. В CMD с той же идентичной программой сигнал поднимается корректно. Почему это?

Программа скомпилирована под msys2 mingw-w64 с g++ -static -static-libstdc++ -std=c++14 -Wall -Wextra -pedantic testan.cpp. В обоих случаях signal() не возвращает 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;
}

мятный выход:

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

$

Вывод CMD:

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

C:\Users\Xunie\Desktop\project>

person Xunie    schedule 30.04.2020    source источник
comment
Согласно советам Mintty, это должно работать в Win10, а для более ранних систем < href="https://github.com/rprichard/winpty" rel="nofollow noreferrer">winpty можно использовать в качестве обходного пути.   -  person ssbssa    schedule 01.05.2020
comment
К вашему сведению, изначально в Windows нет таких сигналов, как SIGINT. Среда выполнения C эмулирует 6 необходимых сигналов плюс SIGBREAK. Он имеет обработчик исключений ОС для эмуляции SIGILL, SIGSEGV и SIGFPE. Два только внутренние в среде выполнения: SIGABRT и SIGTERM. И в консольном приложении у него есть обработчик управления консолью, который отображает CTRL_C_EVENT в SIGINT и CTRL_BREAK_EVENT и CTRL_CLOSE_EVENT в SIGBREAK.   -  person Eryk Sun    schedule 22.05.2020


Ответы (1)


MinTTY - это эмулятор терминала, ориентированный на POSIX, он использует Cygwin/MSYS2 PTY, которые плохо взаимодействуют с собственными (не Cygwin, не MSYS2) программами. Это включает в себя сигналы, обнаружение интерактивного ввода и т. д. MinTTY не пытается это исправить , но Cygwin недавно (начиная с версии 3.1.0) улучшил поддержку этого варианта использования, используя новый ConPTY API. По состоянию на май 2020 года MSYS2 еще не интегрировала эти изменения в свою среду выполнения, поэтому вы пока не видите преимуществ. Тем временем (и в более старых версиях Windows) вы можете использовать оболочку winpty, которую можно установить с помощью pacman.

person David Macek    schedule 02.05.2020
comment
В MSYS2 он по-прежнему отключен по умолчанию, но его можно включить с помощью MSYS=enable_pcon. - person ssbssa; 19.08.2020