答案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()。
答案 0 :(得分:2)
如果写入是原子的,这意味着当读取发生时,整个内容已经存在于缓冲区中,因此读取不完整的唯一方法是内核线程在完成之前决定产生 - 这不会发生在这里。
通常,您可以依赖于同一系统上的管道上的小写()s映射到相同的read()。毫无疑问,4个字节远小于任何缓冲区,因此肯定是原子的。