显然,read(2)系统调用通常可以返回比要求读取的字节更less的字节。 然而,很多程序假设在使用本地文件时,读取(2)永远不会返回比所要求的更less的内容(当然,除非文件更短)。
所以,我的问题是:在Linux上,在哪些情况下可以读取(2)返回小于从打开的文件中读取并且没有遇到EOF并且读取的数量最多只有几千字节时请求的内容?
有些猜测:
POSIX.1-2008指出 :
如果文件中剩余的字节数少于nbyte ,如果read()请求被信号中断,或者如果文件是管道或FIFO或特殊文件,并且少于nbyte ,则返回的值可能小于nbyte nbyte字节立即可供阅读。
基于磁盘的文件系统通常使用不间断读取,这意味着读取操作通常不会被信号中断。 基于网络的文件系统有时使用可中断的读取,可以返回部分数据或不返回数据。 (在NFS的情况下,这可以使用intr
安装选项进行配置。)它们有时也会实现超时。
请记住,即使/ some /任意/文件/路径可能是指一个FIFO或特殊文件,所以你认为是一个普通的文件可能不会。 因此,即使不太可能,也要处理部分读取。
我不得不问:“你为什么关心这个原因”? 如果read可以返回比请求的数量少的字节数(正如你所指出的那样,当然可以)为什么你不想处理这种情况呢?
如果接收到的信号尚未读取单个字节,则只会导致read()失败。 否则,它将返回部分数据。
我猜在其他情况下,备用文件系统可能确实会返回短读。 例如,对于我来说,使基于网络的文件系统像网络套接字一样具有短读取(通常具有它们)是有意义的。
如果它真的是一个你正在阅读的文件,那么你可以在文件结束之前读取最近读取的文件。
不管怎样,通常最好的行为就好像任何读取都可以是简短的读取。 如果读取的是管道或输入设备(stdin)而不是文件,则只要缓冲区大于当前输入缓冲区中的内容,就可以进行短暂读取。
我不确定,但是当操作系统用完页面缓存中的页面时,可能会出现这种情况。 你可以建议在这种情况下调用flush线程,但这取决于在I / O调度器中使用的启发式。 这种情况可能会导致读取返回更少的字节。