为什么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
相关产品推荐
相关产品推荐

