У меня проблемы с пониманием, почему input
не печатает на стандартный вывод сразу после процесса дочернего разветвления. Вместо этого он ожидает, когда родительский файл запишет в свой канал (который должен отображаться в sys.stdin). Это как-то связано с буферизацией?
import os
import select
import sys
r, w = os.pipe()
pid = os.fork()
if pid:
try:
os.close(r)
b = b''
while True:
ins, _, _ = select.select([sys.stdin], [], [], 1)
if ins:
d = os.read(0, 1)
print('parent read', d)
if d == b'\n':
break
b += d
print('parent writing', b)
os.write(w, b)
finally:
os.close(w)
else:
os.close(w)
sys.stdin.close()
sys.stdin = os.fdopen(r)
print('asking for input')
d = raw_input('Enter your input: ')
print(d)
sys.exit(0)
И вывод:
python2 p2.py
asking for input
a
('parent read', 'a')
('parent read', '\n')
('parent writing', 'a')
Enter your input: a
В то время как под python3 (изменяя raw_input на input) он работает как положено:
python3 test.py
asking for input
Enter your input: a
parent read b'a'
parent read b'\n'
parent writing b'a'
a