Используете ли вы read () без указания размера или рассматриваете канал как итератор (for line in f
)? Если это так, то это, вероятно, источник вашей проблемы - read () определено для чтения до конца файла перед возвратом, а не просто для чтения того, что доступно для чтения. Это будет означать, что он будет блокироваться, пока ребенок не вызовет close ().
В примере кода, с которым связано, все в порядке - родительский элемент действует блокирующим образом и просто использует дочерний элемент в целях изоляции. Если вы хотите продолжить, то используйте неблокируемый ввод-вывод, как в опубликованном вами коде (но будьте готовы к обработке неполных данных), или читайте кусками (например, r.read (size) или r.readline () ), который будет блокироваться только до тех пор, пока не будет прочитан определенный размер / строка. (вам все равно нужно будет вызвать флеш на ребенка)
Похоже, обработка канала как итератор также использует некоторый дополнительный буфер, поскольку "for line in r:
" может не дать вам того, что вы хотите, если вам нужно, чтобы каждая строка была немедленно использована. Может быть возможно отключить это, но просто указание 0 для размера буфера в fdopen кажется недостаточным.
Вот пример кода, который должен работать:
import os, sys, time
r,w=os.pipe()
r,w=os.fdopen(r,'r',0), os.fdopen(w,'w',0)
pid = os.fork()
if pid: # Parent
w.close()
while 1:
data=r.readline()
if not data: break
print "parent read: " + data.strip()
else: # Child
r.close()
for i in range(10):
print >>w, "line %s" % i
w.flush()
time.sleep(1)