【发布时间】:2017-10-03 04:55:00
【问题描述】:
我正在尝试在 Python 中使用命名管道来实现 IPC,但是有一个问题。 open 阻塞进程
import os
path = '/tmp/fifo'
os.mkfifo(path)
fifo = open(path, 'w') # never returns
与open(path, 'r')相同
我做错了什么?
Python 3.6.1
【问题讨论】:
标签: python named-pipes
我正在尝试在 Python 中使用命名管道来实现 IPC,但是有一个问题。 open 阻塞进程
import os
path = '/tmp/fifo'
os.mkfifo(path)
fifo = open(path, 'w') # never returns
与open(path, 'r')相同
我做错了什么?
Python 3.6.1
【问题讨论】:
标签: python named-pipes
想通了。 open 阻塞直到管道在另一侧打开
【讨论】:
根据os.mkfifo,需要使用
fifo = open(path, dir_fd='w')
【讨论】:
os.mkfifo(path, dir_fd='w') 抛出 TypeError: argument should be integer or None, not str 和 dir_fd=os.O_WRONLY 没有。但结果是一样的:open 永远阻塞
dir_fd 应该是一个文件描述符,读/写标志。
函数os.mkfifo(path)创建路径是需要的(如果所有的文件夹不存在它建立所有的路径)。
所以,你需要像这样添加文件名:fifo = open(path + file, 'r')
通常,FIFO 用作“客户端”和“服务器”类型进程之间的集合点:服务器打开 FIFO 进行读取,客户端打开 FIFO 进行写入。 请注意,mkfifo() 不会打开 FIFO——它只是创建集合点
【讨论】:
path + file 只会连接字符串,在我的情况下 /tmp 绝对存在,无需创建它。 os.mkfifo创建文件成功ls -latrh /tmp/pipe prw-r--r-- 1 oleg users 0 Oct 3 08:30 /tmp/pipe