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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top