2009-03-23 13 views
8

Sto provando a leggere da un os.pipe() aperto per vedere se è vuoto al momento della lettura. Il problema è che la chiamata a read() causa il blocco del programma finché non c'è effettivamente qualcosa da leggere lì, ma non ce ne saranno, se il test che sto facendo ha avuto successo.Come leggere da un os.pipe() senza essere bloccato?

So che posso usare select.select() con un timeout tuttavia volevo sapere se c'è un'altra soluzione al problema.

risposta

14

Si potrebbe provare questo.

import os, fcntl 
fcntl.fcntl(thePipe, fcntl.F_SETFL, os.O_NONBLOCK) 

Con questo thePipe.read() dovrebbe essere non bloccante.

Da pagina pipe(7) man:

Se un processo tenta di leggere da un tubo vuoto, quindi leggere (2) bloccherà fino dati sono disponibili. (...) non-blocking I/O è possibile utilizzando fcntl (2) F_SETFL operazione per abilitare il file aperto O_NONBLOCK stato bandiera.

+1

Grazie mille. Questo è esattamente ciò di cui avevo bisogno. – mpeterson

+1

Yesssss! Grazie! – juliomalegria

+0

Attenzione: i metodi di file come '.readline()' potrebbero non aspettarsi una modalità non bloccante. – jfs