В типичной UNIX моды, read(2)
возвращает 0 байт, чтобы указать конец-в-файл, который может означать:
- Там нет больше байт в файле
- Другой конец сокета выключился в подключение
- писатель закрыл трубу
В вашем случае, fifo.read()
возвращает пустую строку, потому что писатель закрыл свой файловый дескриптор ,
Вы должны обнаружить, что случай и выйти из вашего цикла:
reader.py:
import os
import errno
FIFO = 'mypipe'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer closed")
break
print('Read: "{0}"'.format(data))
Пример сеанса
Терминал 1:
$ python reader.py
Opening FIFO...
<blocks>
Терминал 2:
$ echo -n 'hello' > mypipe
Терминал 1:
FIFO opened
Read: "hello"
Writer closed
$
Update 1 - Непрерывно повторно открыть
Вы указываете, что вы хотите сохранить список для записи на трубу, предположительно даже после того, как писатель закрыл.
Чтобы сделать это эффективно, вы можете (и должны) использовать тот факт, что
Обычно, не открывая блоки FIFO до другого конца открыт также.
Здесь я добавляю еще один цикл вокруг open
и цикл read
.Таким образом, после того, как труба закрыта, код будет пытаться повторно открыть его, что не будет блокировать до другого писателя открывает трубу:
import os
import errno
FIFO = 'mypipe'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
while True:
print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer closed")
break
print('Read: "{0}"'.format(data))
Терминал 1:
$ python reader.py
Opening FIFO...
<blocks>
Терминал 2:
$ echo -n 'hello' > mypipe
Терминал 1:
FIFO opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>
Терминал 2:
$ echo -n 'hello' > mypipe
Терминал 1:
FIFO opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>
... и так далее.
Вы можете узнать больше, прочитав man
страницу для труб:
Что 'печать (строка)' выход в цикле? И как вы на это пишете? –
Скрипт ожидает данных из другого процесса. Если он принимает строку со специальной строкой, она выполняет некоторые вызовы api. – user1005633
Итак, вы постоянно видите данные в цикле, когда вы 'print (line)'? –