redirecionamento de E / S usando cygwin e mingw

3

Eu escrevi um programa em C e o compilei usando o MinGW. Quando tento rodar esse programa no Cygwin, ele parece se comportar normalmente (ou seja, imprime a saída correta, etc.)

No entanto, estou tentando canalizar a saída para um programa para que eu possa analisar as informações da saída do programa. No entanto, a tubulação não parece estar funcionando, pois não estou recebendo nenhuma entrada no segundo programa.

Confirmei isso usando os seguintes comandos:

Este comando parece funcionar bem:

./prog 

Executar este comando não retorna nada:

./prog | cat

Este comando verifica o primeiro:

./prog | wc

Que retorna:

0 0 0

Eu sei que o script (incluindo o piping do programa) funciona perfeitamente em um ambiente Linux.

Alguém tem alguma ideia de por que a tubulação não está funcionando no Cygwin? Obrigado!

    
por KLee1 08.07.2011 / 18:35

1 resposta

0

Provavelmente isso tem a ver com o stdio buffering, conforme identificado e explicado anteriormente na seção de comentários. Nos meus projetos MinGW, tenho usado frequentemente o seguinte constructo:

#define disable_stdout_buffering() do { \
               setvbuf(stdout, NULL, _IONBF, 0); } while(0)

int main(int argc, char *argv[]) {
    disable_stdout_buffering();
    /* Your code */
    exit(EXIT_SUCCESS);
}

É claro que você também pode adicionar uma chamada a fflush() em uma macro de pré-processamento ou ao enviar seus dados para stdout, no entanto, não adiciona uma chamada de biblioteca adicional a cada buffer gravado em seu console.

    
por 23.11.2012 / 23:29