Forza di bloccaggio letto dopo EAGAIN?
-
04-10-2019 - |
Domanda
Ho un descrittore di file che è aperto per la lettura che può essere non bloccante. Quello che devo fare è semplicemente leggere tutti i dati fino a raggiungere EOF e scrivere i dati in un descrittore di file scrivibile. Poiché il processo che esegue questa copia non è "consapevole" di tutto ciò che sta succedendo intorno a esso, non credo che io possa fare qualcosa di utile durante l'attesa per i dati, e io non voglio usare un ciclo while
(mentre errno
non è EAGAIN
) perché penso che sarebbe uno spreco. C'è un modo per bloccare o sospendere l'esecuzione del processo di copia fino a quando diventano disponibili i dati?
Soluzione
Il tuo altra risposta disinserisce semplicemente O_NONBLOCK
, che imposta il file indietro al blocco. Questo è perfettamente bene, se funziona nella vostra situazione; ma se non è possibile utilizzare select()
al blocco fino a quando il non-blocking descrittore di file è leggibile.
Altri suggerimenti
capitolo 7 della (sg) Linux HOWTO SCSI Generico dà un esempio di come fare questo:
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));