假设我有一个文件,其文件描述符在 EOF 之前剩余的字节数超过 n 个字节,并且我调用了 n 个字节的 read() 系统调用。该函数是否保证将 n 个字节读入缓冲区?还是可以少读点?
The read
系统调用保证读取您所要求的尽可能多的字符,除非它不能读取。但事实证明,存在如此多的例外情况——如此多的情况,它无法读取您要求的那么多字符——以至于基本上最终最安全的假设是任何给定的read
调用可能不会读取您要求的那么多字符。我相信在编写代码时始终牢记这一点是一种很好的做法。
我系统上的手册页显示
如果描述符引用的普通文件在文件结尾之前还剩下那么多字节,则系统保证读取请求的字节数,但在其他情况下则不然。
因此,如果它不是普通文件,或者它是普通文件但没有足够的字符,则您得到的字符数将少于您要求的字符数。但在您询问的情况下,是的,应该保证您获得与您要求的数量完全相同的字符。
尽管如此,如果你发现自己可以选择假设read
据称保证能够准确读取所请求的字符数,而不是承认它可能返回更少的字符数,我总是会编写代码以假设它可能返回更少的字符数。也就是说,如果您有一个类似的电话
r = read(fd, buf, n);
假设如果r
大于 0,它必须恰好是n
。您的代码必须能够处理r < n
这种情况下,当它几乎在文件末尾时它会正常工作,所以除非你想有两个不同的代码路径(一个用于“正常”读取,一个用于最后一次读取),你不妨编写一段代码,可以处理r < n
盒,并让它一直运行。
(另外,正如 Zan Lynx 在评论中提醒的那样,不要让代码注意到r < n
,并推断文件结尾即将到来。等待r == 0
在确定您已到达文件末尾之前。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)