栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python读取名为PIPE

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python读取名为PIPE

以典型的UNIX方式,

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

  • 文件中没有更多字节
  • 套接字的另一端已关闭连接
  • 作者已关闭管道

在您的情况下,

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

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

reader.py

import osimport errnoFIFO = 'mypipe'try:    os.mkfifo(FIFO)except OSError as oe:     if oe.errno != errno.EEXIST:        raiseprint("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...<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO openedRead: "hello"Writer closed$

更新1-不断重新打开

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

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

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

在这里,我周围添加另一个循环

open
read
循环。这样,一旦管道关闭,代码将尝试重新打开它,直到其他编写者打开管道为止,该代码将阻塞:

import osimport errnoFIFO = 'mypipe'try:    os.mkfifo(FIFO)except OSError as oe:    if oe.errno != errno.EEXIST:        raisewhile 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...<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO openedRead: "hello"Writer closedOpening FIFO...<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO openedRead: "hello"Writer closedOpening FIFO...<blocks>

… 等等。


您可以通过阅读

man
有关管道的页面来了解更多信息:

  • PIPE(7)-Linux程序员手册
  • FIFO(7)-Linux程序员手册


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号