Situation:
new_pipe = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) # pipe_path points to a FIFO
data = os.read(new_pipe, 1024)
The read occasionally raises errno -11: Resource temporarily unavailable.
When is this error raised? It seems very rare, as the common cases return data:
From the POSIX specification of the read
system call (emphasis mine):
When attempting to read from an empty pipe or FIFO:
If no process has the pipe open for writing, read() shall return 0 to indicate end-of-file.
If some process has the pipe open for writing and O_NONBLOCK is set, read() shall return -1 and set errno to [EAGAIN].
So basically your second assumption is wrong:
If the writer has the pipe opened, but no data is in the fifo, empty str ('') is also returned
This would be against the specification and I can't reproduce that behaviour on my machine (it raises EAGAIN
for me). This is not a big problem however, you can just catch the exception and retry:
import errno
def safe_read(fd, size=1024):
''' reads data from a pipe and returns `None` on EAGAIN '''
try:
return os.read(fd, size)
except OSError, exc:
if exc.errno == errno.EAGAIN:
return None
raise
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With