GNU/Linux >> Linux Esercitazione >  >> Linux

read(2) può restituire zero quando non è in EOF?

Dopo alcune ricerche, in realtà ci sono alcune circostanze in cui restituirà 0 che potresti non pensare come "EOF".

Per i dettagli grintosi, vedere la definizione POSIX per read():http://opengroup.org/onlinepubs/007908775/xsh/read.html

Alcuni degni di nota sono se gli chiedi di leggere 0 byte -- ricontrolla che non gli stai passando accidentalmente 0 -- e leggere oltre la fine della parte "scritta" del file (puoi effettivamente cercare oltre la fine del file, che "estende" il file con zeri se ci scrivi, ma finché non lo fai, "EOF" è ancora alla fine della parte già scritta).

La mia ipotesi migliore è che tu abbia un problema di temporizzazione da qualche parte. Alcune domande che devi porre sono "Come vengono scritti questi file?" e "Sono sicuro che non siano di lunghezza zero quando provo a leggerli?". Per il secondo, puoi provare a eseguire una stat() sul file prima di leggerlo per vedere qual è la sua dimensione attuale.


L'unico altro caso in cui posso pensare a read() che restituisce 0 è se passi in nbytes come 0; a volte ciò può accadere se passi la dimensione di qualcosa o altro come parametro. Potrebbe essere quello che sta succedendo in questo momento?

Se il file non è pronto per essere letto, ciò che dovrebbe accadere è read restituisce -1 e errno è impostato su EAGAIN.


Linux
  1. Perché non posso dividere un file .ape?

  2. Impossibile eseguire il comando di configurazione:"nessun file o directory di questo tipo"?

  3. Trova l'età del file più vecchio in una riga o restituisci zero?

  4. file:comando non trovato

  5. Come posso verificare che un file esista ed eseguire un comando in caso contrario?

Come leggere un file riga per riga in Bash

Come posso rendere permanentemente un file di sola lettura su Linux in modo che anche root non possa modificarlo?

/etc/motd non viene visualizzato quando una named pipe?

tar:lettura breve

Come posso sostituire lsof all'interno di un Docker (nativo, non basato su LXC)

Perché rm manual dice che possiamo eseguirlo senza alcun argomento, quando questo non è vero?