Ответ 1
Из спецификация POSIX системного вызова read
(выделение мое):
При попытке чтения из пустого канала или FIFO:
Если ни один процесс не имеет открытого канала для записи, read() должен возвращать 0 в укажите конец файла.
Если какой-либо процесс имеет открытый канал для записи и установлен O_NONBLOCK, read() возвращает -1 и устанавливает errno в [EAGAIN].
Итак, в основном ваше второе предположение неверно:
Если у писателя открыт канал, но нет данных в fifo, также возвращается пустая строка ('')
Это будет противоречить спецификации, и я не могу воспроизвести это поведение на моей машине (для меня это поднимает EAGAIN
). Однако это не большая проблема, вы можете просто поймать исключение и повторить попытку:
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