其他分享
首页 > 其他分享> > 从文件中读取()-阻塞与非阻塞行为

从文件中读取()-阻塞与非阻塞行为

作者:互联网

假设我们使用fopen()打开了一个文件,并从接收到的文件指针中使用fileno()获取了文件描述符.然后,我们从该文件中对相对较小的数据块进行大量的(> 10 ^ 8)随机读取(),大小在4Bytes到10KBytes之间:

它是预期的行为吗,如果文件系统是一个文件,则read()可能返回的字节数少于请求的字节数,而无需设置errno.

> ext3
> NFS
> OCFS2
> 2和3的组合(通过NFS的OCFS2)

我的读物得出的结论是,不可能1.(如果文件未设置O_NONBLOCK,如果可能,则ext3对其进行设置),但是其他三个(2.,3.,4.)我是我不确定.

(顺便说一句:无论如何我都可以假设O_NONBLOCK未被设置为默认值吗?)

之所以出现这个问题,是因为我观察到read()返回的字节数更少,然后在第4种情况下未设置errno.

通过测试进行深入研究的问题是,这样的行为发生在< 1/1000000000的情况下...-仍然很常见:-} 更新:平均文件大小在大约TB到1GB之间.

解决方法:

您不应假定read()返回的字节数不会少于任何文件系统所请求的字节数.在大读取的情况下尤其如此,因为POSIX.1表示大于SSIZE_MAX的大小的read()行为取决于实现.我现在使用的这个主流Unix机器上,SSIZE_MAX是32767字节. read()今天总是返回全部金额的事实并不意味着将来会返回.

一个可能的原因可能是将来I / O优先级会在内核中得到更充分的体现.例如.您尝试从同一设备读取另一个优先级更高的进程,并且如果您的进程没有导致磁头从另一个进程想要的扇区移开,则另一个进程将获得更好的吞吐量.内核可能选择给您的read()一小段时间来让您暂时摆脱困境,而不是继续进行低效率的交错块读取.为了I / O效率Stranger things have been done.没有被禁止的东西通常是强制性的.

标签:c-3,linux,nfs,ocfs2
来源: https://codeday.me/bug/20191012/1901196.html