em janelas, como ter stdin sem bloqueio que é um tubo redirecionada?
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.
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