Pergunta

Eu tenho um programa do Windows C que obtém seus dados através de um tubo stdin redirecionada, mais ou menos assim:

./some-data-generator | ./myprogram

O problema é que eu preciso ser capaz de ler a partir stdin de uma maneira non-blocking. A razão para isso é que (1) a entrada é um fluxo de dados e não há EOF e (2) o programa precisa ser capaz de interromper seu segmento de leitura stdin a qualquer momento. blocos fread quando não há dados, então isso torna muito difícil.

Em Unix isso não é problema, como você pode definir o modo de bloqueio de um descritor de arquivo com fcntl e O_NONBLOCK. No entanto, fcntl não existe no Windows.

Eu tentei usar SetNamedPipeHandleState:

    DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
    BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
    DWORD err= GetLastError();

mas esta falha com ERROR_ACCESS_DENIED (0x5).

Eu não tenho certeza o que mais fazer. É este realmente impossível (!) Ou é apenas altamente ofuscado? Os recursos na rede são bastante escassos para esse problema específico.

Foi útil?

Solução

O apprach pedido, consulte há entrada pronto para ler:

  • Para o modo de console, você pode usar GetNumberOfConsoleInputEvents ().
  • Para o redirecionamento de tubulação, você pode usar PeekNamedPipe ()

Outras dicas

Você pode usar async I / O para ler a partir da alça, como a ReadFileEx () chamada WIN32. Use CancelIo () para terminar a leitura, na ausência de entrada.

Veja MSDN em http://msdn.microsoft .com / en-us / library / aa365468 (VS.85) .aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top