Se você adicionar fflush(stdout)
ao seu loop while
(depois de printf
), seu programa funcionará como esperado, mesmo dentro do Mintty. Você também deve poder chamar setbuf(stdout, NULL)
como a primeira operação que você faz no stdout e ter esse trabalho.
Você também pode executar c: \ cygwin \ bin \ bash dentro da janela do console do Windows e seu programa original funcionará como você, exceto. Eu não tentei, mas você também deve ser capaz de executar o bash dentro de uma janela do console ou do console2 e fazer o seu programa original funcionar conforme o esperado.
Isso é para dizer: isso é sobre menta.
Aqui está (parte do) o que está acontecendo:
O console do Windows é muito especial. O Windows possui um serviço chamado Subsistema de Tempo de Execução Cliente / Servidor. Quando você inicia um prompt do cmd no Windows, o que você está realmente fazendo é conectar-se ao Subsistema de Tempo de Execução do Cliente / Servidor, e ele está criando a janela para você.
O Mintty, por outro lado, é uma janela "regular" (que por acaso está rodando um emulador de terminal).
As rotinas de e / s da biblioteca C da Microsoft realmente testam se estão sendo executadas em uma janela criada pelo Subsistema Runtime do Cliente / Servidor e mudam seu comportamento se estiverem. Uma mudança que eles fazem é desativar o buffer completo para stdout.
Quando você executa sob o comando mintty, as rotinas gets / puts do Windows acham que elas não estão sendo executadas em um prompt de comando, portanto, elas estão fazendo um buffer completo.
Eis mais um truque: em bash
em execução em mintty
, é possível executar cat | echo1.exe
. Em seguida, digite algumas coisas e quando você atingir ^D
, toda a saída stdout armazenada em buffer será mostrada de uma só vez.
O motivo pelo qual o truque cat | echo1.exe
funciona é que cat
é um programa cygwin. O Cygwin é, no fundo, uma biblioteca de emulação posix. Portanto, o stdin
de cat
é emulado pela biblioteca do Cygwin e a biblioteca do Cygwin trata ^D
de maneira diferente de um stdin do Windows "real".
Mas se você executar apenas echo1.exe
em bash
sob mintty
, suas teclas estarão entrando em um fluxo de arquivo não emulado (ou seja, seu stdin é um stdin real do Windows, não é emulado pela biblioteca Cygwin) , então ^D
não envia eof. Em vez disso, ^Z
enviaria eof, mas ^Z
significa algo especial para bash, por isso não é enviado. Em vez disso, você precisa acessar ^C
, que finaliza echo1.exe
imediatamente (e não libera os buffers, o que está correto).