Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;简读;从文件系统,什么时候可以发生?_C_Linux_Filesystems_System Calls - Fatal编程技术网

C &引用;简读;从文件系统,什么时候可以发生?

C &引用;简读;从文件系统,什么时候可以发生?,c,linux,filesystems,system-calls,C,Linux,Filesystems,System Calls,很明显,一般来说,read(2)系统调用返回的字节数比请求读取的字节数少。然而,相当多的程序假设在处理本地文件时,read(2)的返回值永远不会小于所请求的值(当然,除非文件更短) 所以,我的问题是:在Linux上,如果从打开的文件中读取而没有遇到EOF,并且读取的量最多只有几千字节,那么在哪种情况下读取(2)返回的值会小于请求的值 一些猜测: 接收到的信号能像那样中断读取,但不能使其失败吗 不同的文件系统会影响这种行为吗?jffs2有什么特别之处吗 如果尚未读取单个字节,则接收到的信号只会使

很明显,一般来说,read(2)系统调用返回的字节数比请求读取的字节数少。然而,相当多的程序假设在处理本地文件时,read(2)的返回值永远不会小于所请求的值(当然,除非文件更短)

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

一些猜测:

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

如果尚未读取单个字节,则接收到的信号只会使read()失败。否则,它将返回部分数据


我猜在其他情况下,备用文件系统可能确实会返回短读。例如,(对我来说)让一个基于网络的文件系统的行为就像一个网络套接字wrt short reads(=经常使用它们)是有道理的。

我不得不问:“你为什么关心原因?”?如果read返回的字节数比请求的字节数少(正如您所指出的,它当然可以),那么您为什么不想处理这种情况呢?

如果它确实是您正在读取的文件,那么您可以将其作为文件结束前的最后一次读取进行短读

然而,一般来说,最好表现得好像任何阅读都可以是简短的阅读。如果您正在读取的是管道或输入设备(stdin)而不是文件,则只要您的缓冲区大于当前输入缓冲区中的内容,就可以进行短时间读取。

:

返回的值可能小于 nbyte如果中剩余的字节数为 如果 read()请求被中断 信号,或者如果文件是管道或 FIFO或特殊文件,并且具有较少的 立即可用的字节数超过nbyte 用于阅读

基于磁盘的文件系统通常使用不间断读取,这意味着 读取操作通常不能被信号中断。基于网络的 文件系统有时使用可中断读取,这可能返回部分数据或不返回任何数据。 (对于NFS,可以使用
intr
mount选项进行配置。) 它们有时也执行超时

请记住,即使是/some/arbitral/file/path也可能引用FIFO或 特殊文件,所以您认为是常规文件的文件可能不是。因此
处理部分读取的良好实践,即使它们可能不太可能。

我不确定,但当操作系统页面缓存中的页面用完时,可能会出现这种情况。您可以建议在这种情况下调用flush线程,但这取决于I/O调度程序中使用的启发式。这种情况可能会导致读取返回更少的字节。

我一直以来所读取的被称为“短读取”的内容与文件访问读取(2)无关,而是与磁盘扇区的物理读取有关。当读取扇区的数据部分时,发现有效的磁信号比创建扇区的512(或4096或其他)字节要少时,就会发生这种情况。这会导致无效扇区和读取错误。关于“何时”,或者更确切地说,为什么会发生这种情况,很可能是因为写入该扇区时,驱动器的供电中断。

读(2)是否会以一个称为“短读”的物理错误代码结束?

要补充的是,您无论如何都要检查数据-因此,如果数据短,您会立即知道。否则,阅读的原因还有什么?尼尔,我不得不问:你为什么关心他为什么想知道这是怎么发生的?即使他处理这种情况,了解它是如何发生的仍然是非常有帮助的,例如,这样他就可以尝试并测试他的代码是否按预期处理它。如果不是他自己的个人密码没有处理这个案子,这些信息将作为说明的一部分,用于重现任何错误报告或补丁提交时应出现的问题。我提出的原因是,我们在数千个系统的安装基础上看到了这种行为,我们需要尽可能准确地评估这个问题在长期内可能会有多普遍跑了解它是如何发生或为什么发生的是调查的一部分。对于新编写的代码来说,处理短读是一个很好的实践。但是,假设所有东西都处理来自所有“文件”的短读取是非常危险的。大多数公司的遗留代码中都有你甚至不想读到的东西。不幸的是,在许多第三方库中,不处理短读也是一种非常常见的模式。因此,知道什么时候会发生这种情况几乎毫无用处,因为它可以帮助您知道在哪里会出现问题。哪些程序“假设在处理本地文件时,read(2)的返回值永远不会低于要求的值”?在一般情况下,这听起来像一个bug。例如,klibc utils中的fstype binary。似乎许多可以假定直接处理文件的低级程序都假定读取永远不会短。谢谢。如果这是正确的,那么我们还有更多的调试要做。我们在jffs2文件系统上得到了确认的短读(我想它不应该有可中断的读),并且该文件肯定是一个常规文件。这种情况每年最多发生一次,因此再现性很低。允许文件系统在读取一个块后中断读取本身。我不遇到EOF的意思是,它不是文件结束前的最后一次读取。此外,该文件是一个常规文件。谢谢,这很有帮助!尽管关于可中断和不可中断文件系统的信息更有用。