Python永远打开fifo块

Posted

技术标签:

【中文标题】Python永远打开fifo块【英文标题】:Python open fifo blocks forever 【发布时间】: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

【问题讨论】:

【参考方案1】:

想通了。 open 阻塞直到管道在另一侧打开

【讨论】:

【参考方案2】:

根据os.mkfifo,需要使用 fifo = open(path, dir_fd='w')

【讨论】:

不起作用。 os.mkfifo(path, dir_fd='w') 抛出 TypeError: argument should be integer or None, not strdir_fd=os.O_WRONLY 没有。但结果是一样的:open 永远阻塞 dir_fd 应该是一个文件描述符,读/写标志。【参考方案3】:

函数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

以上是关于Python永远打开fifo块的主要内容,如果未能解决你的问题,请参考以下文章

Linux fifo 缓冲采坑

为啥这个while循环在Python中永远不会停止

我可以在 Linux 上打开命名管道以在 Python 中进行非阻塞写入吗?

Python 从命名管道/FIFO 中读取 JSON

为啥python在关闭fifo文件时会生成sigpipe异常?

如何在 Python 中检测到 fifo 已被删除