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

Nak*_*ble 13 c linux filesystems system-calls

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

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

一些猜测:

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

mar*_*k4o 12

POSIX.1-2008声明:

如果文件中剩余的字节数小于nbyte,如果read()请求被信号中断,或者文件是管道或FIFO或特殊文件并且少于nbyte,则 返回的值可能小于 nbyte nbyte字节可立即读取.

基于磁盘的文件系统通常使用不间断读取,这意味着读取操作通常不会被信号中断.基于网络的文件系统有时使用可中断读取,这可以返回部分数据或不返回数据.(在NFS的情况下,这可以使用intrmount选项进行配置.)它们有时也会实现超时.

请记住,偶数/某些/任意/文件/路径可能引用FIFO或特殊文件,因此您认为常规文件可能不是.因此,即使可能不太可能,也应该处理部分读取.