posix read()可以从管道接收少于请求的4个字节吗?

时间:2016-05-20 20:51:08

标签: linux pipe posix

答案https://stackoverflow.com/a/1586277/6362199中的程序使用系统调用read()从管道接收4个字节。它假设函数read()返回-1,0或4.如果read()函数被信号中断,它是否可以返回1,2或3?

在阅读(2)的手册页中有:

  

成功时,返回读取的字节数(零表示   文件结束),文件位置按此编号前进。的它   如果此数字小于字节数,则不是错误   请求; 这可能会发生,例如因为字节数较少   实际上现在可用(也许是因为我们接近   文件结束,或者因为我们正在读取管道或从管道读取   终端),或因为read()被信号中断。

这是否意味着在接收4字节这么少的数据时可以中断read()函数?是否应该更正此答案的源代码?

在手册页管道(7)中有:

  

POSIX.1-2001表示小于PIPE_BUF字节的write(2)必须是原子的:输出数据作为连续序列写入管道。

但是没有类似的read()。

1 个答案:

答案 0 :(得分:2)

如果写入是原子的,这意味着当读取发生时,整个内容已经存在于缓冲区中,因此读取不完整的唯一方法是内核线程在完成之前决定产生 - 这不会发生在这里。

通常,您可以依赖于同一系统上的管道上的小写()s映射到相同的read()。毫无疑问,4个字节远小于任何缓冲区,因此肯定是原子的。