向pipe写入1字节并读取后,再次读取会阻塞还是返回0
阻塞模式下空Pipe二次读取行为结果
在你描述的场景下,进程1的第二次读取操作会再次进入阻塞状态,不会直接返回0,直到持有该Pipe写端的进程再次写入数据,或者所有写端被关闭。
阻塞模式下对Pipe执行
read()调用的返回逻辑遵循两个明确规则:
- 若Pipe不为空:读取对应长度的字节,返回实际读取到的字节数
- 若Pipe为空:
- 仍有任意进程持有该Pipe的写端:调用阻塞,等待新数据写入
- 所有进程都已关闭该Pipe的写端:直接返回0,表示管道已到结束位置
对应你给出的操作流程分析如下:
- 步骤4完成后,Pipe中仅有的1字节已经被进程1读取完毕,Pipe回到空状态
- 此时向Pipe写入数据的另一个进程仍然持有该Pipe的可写端,没有主动关闭,因此不符合返回0的触发条件
- 因此进程1的第二次读操作会进入阻塞,等待新的写入数据
边界场景补充
如果步骤4执行完成后,写入数据的进程主动关闭了自己持有的Pipe写端,此时该Pipe没有任何活跃写端,那么进程1的第二次读操作才会直接返回0。
内容的提问来源于stack exchange,提问作者African_king
相关产品推荐
相关产品推荐

