You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么FIFO写入端关闭后读取端仍持续读取?如何实现阻塞等待新写入端?

成因说明
  • POSIX 命名管道(FIFO)的标准机制规定:当管道的所有写入端进程退出、对应的文件描述符全部关闭后,读取端的read()操作会立刻返回空字符串(EOF标记),不会再保持阻塞状态。
  • 你当前的读取端代码没有对EOF(空字符串返回值)做任何处理,进入死循环后会持续调用read(),也就会不停拿到空字符串输出。
调整方案

你只需要修改读取端逻辑:当读到空字符串时,关闭当前FIFO句柄,重新打开FIFO即可。因为读模式打开FIFO的操作默认是阻塞的,只有当有写入端进程打开同一个FIFO时,open()调用才会返回,正好匹配你等待新写入端的需求。

修改后的读取端代码如下:

while True:
    # 无活跃写入端时重新打开FIFO,open会自动阻塞到有新写入端启动
    fifo_read = open('buffer', 'r')
    while True:
        data = fifo_read.read(1)
        if not data:
            # 触发EOF,关闭旧句柄,回到外层循环重开FIFO
            fifo_read.close()
            break
        print(f'"{data}" read from buffer')

写入端代码无需调整,直接正常启动即可生效。

内容的提问来源于stack exchange,提问作者ShayakSarkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:18:02