Когда вы закрываете дескриптор файла, вы больше не можете его использовать.
Канал однонаправленный ; во многих приложениях вы просто выбираете между двумя вашими процессами, какой из них будет читателем, а какой - писателем.
Но с определенной синхронизацией c вы можете поменять местами эти две роли, как предложено в вашем примере (см. редактирование ниже).
Если вам нужен двунаправленный поток, вы можете использовать socketpair(PF_LOCAL, SOCK_STREAM, 0, fd)
.
, о закрытии не слишком рано
Просто закройте конец канала, если вы уверены, что вашему процессу он больше не понадобится.
Просто не ожидайте обнаружить конец файла перед синхронизацией сигнал, потому что другой конец канала еще не закрыт.
Этот пример может помочь.
#!/usr/bin/env python
import sys
import os
import signal
fd=os.pipe()
p=os.fork()
if p==0:
signal.signal(signal.SIGUSR1, lambda signum, frame: 0)
os.write(fd[1], b'A')
os.close(fd[1]) # I will never write again to this pipe
signal.pause() # wait for the signal before trying to read
b=os.read(fd[0], 1)
os.close(fd[0]) # I will never read again from this pipe
sys.stdout.write('child got <%s>\n'%b)
else:
a=os.read(fd[0], 1)
os.close(fd[0]) # I will never read again from this pipe
sys.stdout.write('parent got <%s>\n'%a)
os.kill(p, signal.SIGUSR1) # now the child is allowed to read
os.write(fd[1], b'B')
os.close(fd[1]) # I will never write again to this pipe
os.wait()