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



答案中的程序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)s必须是原子的:输出数据作为连续序列写入管道。

但read()没有类似之处。

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

通常,您可以在同一系统上的管道上使用小的write(),将其映射到相同的read()。4字节无疑比任何缓冲区都要小得多,所以它肯定是原子的。

最新更新