O console do Windows degrada: programas de repente não conseguem lidar com ctrl-c

0

De vez em quando, os programas de console que eu executo não conseguem lidar com ctrl-c . Os exemplos são cygwin programs, se eu os executar no console em vez de mintty e a ferramenta de áudio da linha de comando sox.exe .

Eu geralmente digito Win-R , cmd , Enter e, em seguida, inicio um programa.

Normalmente, quando você executar um shell%% co_de Cygwin em um console e pressione o Windows ctrl-c, ele lida com isso e re-imprime sua pronta, mas agora está terminado e eu estou solicitado bash

Normalmente, Terminate batch job (Y/N)? imprime uma mensagem "abortada" em resposta a ctrl-c, mas agora falha e o pop-up% GU_de% GUI padrão é exibido.

Além disso, se eu iniciar alguns programas a partir de um arquivo sox.exe , também receberei outro pop-up: sox.exe has stopped working

Após a reinicialização, tudo funciona novamente. Logoff / login ou usuário do switch não funcionam.

O seguinte programa simples também trava na minha máquina, mas o mesmo binário é bem sucedido em outro:

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <conio.h>

static BOOL WINAPI MyHandlerRoutine(
    _In_ DWORD dwCtrlType
) {
    switch (dwCtrlType) {
    case CTRL_C_EVENT:
        printf("ctrl-c pressed\n");
        return TRUE;
    case CTRL_BREAK_EVENT:
        printf("ctrl-break pressed\n");
        return TRUE;
    }
    return FALSE;
}

int main()
{
    int c;
    DWORD dw = 0;
    BOOL b;

    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);

    b = GetConsoleMode(hStdin, &dw);
    printf("GetConsoleMode() returned %d %u\n", (int)b, dw);

    dw = dw & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);

    dw = ENABLE_PROCESSED_INPUT;

    SetLastError(0);

    b = SetConsoleMode(hStdin, dw);
    printf("SetConsoleMode(%u) returned %d\n", dw, (int)b);

    if (!b) {
        printf("GetLastError() returned %u\n", GetLastError());
    }

    b = SetConsoleCtrlHandler(MyHandlerRoutine, TRUE);
    printf("SetConsoleCtrlHandler() returned %d\n", (int)b);

    printf("press ENTER to exit\n");
    for (;;) {
        char buf[1];
        c = getchar();
        printf("%02x ", c);
        // EOF == c || 
        if (10 == c || 13 == c) break;
    }
    return 0;
}
    
por basin 06.12.2017 / 11:28

0 respostas