很明显,一般来说,read(2)系统调用返回的字节数少于要求读取的字节数。但是,相当多的程序假设在使用本地文件时,read(2)永远不会返回少于所询问的内容(当然,除非文件更短)。
所以,我的问题是:在Linux上,在这种情况下,如果从打开的文件中读取并且没有遇到EOF并且读取的数量最多为几千字节,则读取(2)的返回次数少于所请求的数量? / p>
一些猜测:
答案 0 :(得分:12)
返回的值可能小于 nbyte 如果剩下的字节数 该文件小于 nbyte ,如果是 read()请求被a中断 信号,或者如果文件是管道或 FIFO或特殊文件并且数量较少 比 nbyte 字节立即可用 阅读。
基于磁盘的文件系统通常使用不间断读取,这意味着
读操作一般不能被信号中断。基于网络的
文件系统有时使用可中断读取,这可以返回部分数据或不返回数据。
(对于NFS,可以使用intr
挂载选项进行配置。)
他们有时也会实施超时。
请记住,偶数/某些/任意/文件/路径可能指的是FIFO或 特殊文件,所以您认为常规文件可能不是。因此 处理部分读取的好习惯,即使它们可能不太可能。
答案 1 :(得分:3)
我不得不问:“你为什么关心这个原因”?如果读取可以返回少于请求数量的字节数(正如你指出的那样,当然可以),为什么你不想处理这种情况呢?
答案 2 :(得分:1)
如果接收到的信号尚未读取单个字节,则只会使read()失败。否则,它将返回部分数据。
我想在其他情况下,备用文件系统确实会返回短读取。例如,对我来说,基于网络的文件系统的行为就像网络套接字一样,读取时间很短(=经常使用它们)。
答案 3 :(得分:1)
如果它确实是您正在阅读的文件,那么您可以在文件结束前的最后一次读取时进行简短读取。
然而,通常最好表现为任何读取都可能是短读。如果您正在读取的是管道或输入设备(stdin)而不是文件,则只要缓冲区大于当前输入缓冲区中的缓冲区,就可以进行简短读取。
答案 4 :(得分:0)
我不确定,但是当操作系统页面缓存中的页面用完时,可能会出现这种情况。您可以建议在这种情况下调用flush线程,但这取决于I / O调度程序中使用的启发式算法。这种情况可能导致读取返回更少的字节。
答案 5 :(得分:0)
我一直读到的被称为“短读”的内容与文件访问read(2)无关,而与磁盘扇区的物理读取有关。当在读取扇区的数据部分时,发现有效磁信号比构成扇区的512(或4096或其他任何字节)字节少时,就会发生这种情况。这将导致无效扇区和读取错误。关于“何时”,或更确切地说为什么发生,最可能是因为在写入该扇区时驱动器的功率下降了。
难道read(2)会以称为“短读”的物理错误代码结尾?