从文件系统“短读”,什么时候可以发生?

时间:2009-12-27 00:50:55

标签: c linux filesystems system-calls

很明显,一般来说,read(2)系统调用返回的字节数少于要求读取的字节数。但是,相当多的程序假设在使用本地文件时,read(2)永远不会返回少于所询问的内容(当然,除非文件更短)。

所以,我的问题是:在Linux上,在这种情况下,如果从打开的文件中读取并且没有遇到EOF并且读取的数量最多为几千字节,则读取(2)的返回次数少于所请求的数量? / p>

一些猜测:

  • 接收到的信号是否可以中断读取,但不能使其失败?
  • 不同的文件系统会影响这种行为吗? jffs2有什么特别之处吗?

6 个答案:

答案 0 :(得分:12)

POSIX.1-2008 states

  

返回的值可能小于    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)会以称为“短读”的物理错误代码结尾?