in finestre, come avere non bloccante stdin che è una pipa reindirizzato?
Domanda
Ho un programma per Windows C che ottiene i suoi dati attraverso un reindirizzato stdin
tubo, un po 'come questo:
./some-data-generator | ./myprogram
Il problema è che ho bisogno di essere in grado di leggere da EOF
in modo non-blocking. La ragione di questo è che (1) l'ingresso è un flusso di dati e non c'è fread
e (2) il programma deve essere in grado di interrompere la sua fcntl
- filo lettura in qualsiasi momento. O_NONBLOCK
blocchi quando non ci sono i dati, quindi questo rende molto difficile.
In Unix questo non è un problema, come si può impostare la modalità di blocco di un descrittore di file con SetNamedPipeHandleState
e ERROR_ACCESS_DENIED
. Tuttavia, 0x5
non esiste su Windows.
Ho provato ad utilizzare <=>:
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
ma questo fallisce con <=> (<=>).
Non sono sicuro che altro fare. E 'questo in realtà impossibile (!) O è solo altamente offuscato? Le risorse in rete sono piuttosto scarsa per questo particolare problema.
Soluzione
L'apprach ordine, verificare che non v'è l'ingresso pronto a leggere:
- Per la modalità console, è possibile utilizzare GetNumberOfConsoleInputEvents ().
- per il reindirizzamento del tubo, è possibile utilizzare PeekNamedPipe ()
Altri suggerimenti
Si potrebbe utilizzare async I / O per leggere dal manico, come ad esempio la chiamata WIN32 ReadFileEx (). Utilizzare CancelIo () per terminare la lettura in assenza di ingresso.
Vedere MSDN all'indirizzo http://msdn.microsoft .com / it-it / library / aa365468 (VS.85) aspx