Получение readline для блокировки на FIFO - PullRequest
7 голосов
/ 09 марта 2010

Я создаю fifo:

mkfifo tofetch

Я запускаю этот код Python:

fetchlistfile = file("tofetch", "r")
while 1:
    nextfetch = fetchlistfile.readline()
    print nextfetch

Он останавливается на readline, как я надеюсь. Я бегу:

echo "test" > tofetch

И моя программа больше не останавливается. Он читает строку, а затем продолжает цикл навсегда. Почему он не остановится снова, когда нет новых данных?

Я также пытался посмотреть "not fetchlistfile.closed", я не возражал бы открывать его после каждой записи, но Python считает, что fifo все еще открыт.

1 Ответ

4 голосов
/ 09 марта 2010

Согласно документации для readline , она возвращает пустую строку тогда и только тогда, когда вы находитесь в конце файла. Закрыто не то же самое, что конец файла. Файловый объект будет закрыт только при вызове .close (). Когда ваш код достигает конца файла, readline () продолжает возвращать пустую строку.

Если вы просто используете объект файла в качестве итератора, Python будет автоматически читать строку за раз и останавливаться в конце файла. Как это:

fetchlistfile = file("tofetch", "r")
for nextfetch in fetchlistfile:
    print nextfetch

Команда echo "test" > tofetch открывает именованный канал, записывает в него «тест» и закрывает его конец канала. Поскольку конец записи канала закрыт, конец чтения видит конец файла.

...