python 命名管道_Python读取名为PIPE

小编典典

以典型的UNIX方式,read(2)返回0字节以指示文件结束,这可能意味着:

文件中没有更多字节

套接字的另一端已关闭连接

作者已关闭管道

在您的情况下,fifo.read()正在返回一个空字符串,因为编写器已关闭其文件描述符。

您应该检测到这种情况并打破循环:

reader.py :

import os

import errno

FIFO = 'mypipe'

try:

os.mkfifo(FIFO)

except OSError as oe:

if oe.errno != errno.EEXIST:

raise

print("Opening FIFO...")

with open(FIFO) as fifo:

print("FIFO opened")

while True:

data = fifo.read()

if len(data) == 0:

print("Writer closed")

break

print('Read: "{0}"'.format(data))

会话示例

1号航站楼 :

$ python reader.py

Opening FIFO...

2号航站楼 :

$ echo -n 'hello' > mypipe

1号航站楼 :

FIFO opened

Read: "hello"

Writer closed

$

更新1-不断重新打开

您指出您想继续监听管道上的写入,即使在关闭写入器之后也是如此。

为了有效地做到这一点,您可以(并且应该)利用以下事实:

通常,打开FIFO块,直到另一端也打开。

在这里,我周围添加另一个循环open和read循环。这样,一旦管道关闭,代码将尝试重新打开它,直到其他编写者打开管道为止,该代码将阻塞:

import os

import errno

FIFO = 'mypipe'

try:

os.mkfifo(FIFO)

except OSError as oe:

if oe.errno != errno.EEXIST:

raise

while True:

print("Opening FIFO...")

with open(FIFO) as fifo:

print("FIFO opened")

while True:

data = fifo.read()

if len(data) == 0:

print("Writer closed")

break

print('Read: "{0}"'.format(data))

1号航站楼 :

$ python reader.py

Opening FIFO...

2号航站楼 :

$ echo -n 'hello' > mypipe

1号航站楼 :

FIFO opened

Read: "hello"

Writer closed

Opening FIFO...

2号航站楼 :

$ echo -n 'hello' > mypipe

1号航站楼 :

FIFO opened

Read: "hello"

Writer closed

Opening FIFO...

… 等等。

您可以通过阅读man有关管道的页面来了解更多信息:

2020-06-02

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值