que tienen un programa de Windows C, que obtiene sus datos a través de un stdin
tubería redirigida, algo así como esto:en windows, ¿cómo tener stdin sin bloqueo que es una tubería redirigida?
./some-data-generator | ./myprogram
El problema es que tengo que ser capaz de leer de stdin
en una forma no bloqueante. La razón de esto es que (1) la entrada es una secuencia de datos y no hay EOF
y (2) el programa necesita poder abortar su subproceso stdin
-reading en cualquier momento. fread
bloques cuando no hay datos, por lo que esto lo hace muy difícil.
En Unix esto no es un problema, ya que puede establecer el modo de bloqueo de un descriptor de archivo con fcntl
y O_NONBLOCK
. Sin embargo, fcntl
no existe en Windows.
He intentado utilizar SetNamedPipeHandleState
:
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
pero esta falla con ERROR_ACCESS_DENIED
(0x5
).
No estoy seguro de qué más hacer. ¿Es esto realmente imposible (!) O solo está muy ofuscado? Los recursos en la red son bastante escasos para este problema en particular.
PeekNamedPipe era lo que estaba buscando ... Esto le permite llamar a ReadFile para que no se bloquee. – paleozogt