read() 系统调用将实际读取的数据量

Elo*_*loo 1 c linux file

假设我有一个文件,该文件的文件描述符在 EOF 之前剩余超过 n 个字节,并且我调用了 n 个字节的 read() 系统调用。该函数是否保证将 n 个字节读入缓冲区?还是可以少读一点?

Ste*_*mit 5

read系统调用是保证你要求阅读尽可能多的人物众多,除了当它不能。但事实证明,有如此多的例外——在很多情况下它无法读取您要求的那么多字符——以至于基本上最安全地假设任何给定的read调用可能不会读取那么多你要求的字符。我相信始终牢记这一点来编写代码是一种很好的做法。

我系统上的手册页说

如果描述符引用一个在文件结束前剩余那么多字节的普通文件,则系统保证读取请求的字节数,但没有其他情况。

因此,如果它不是一个普通文件,或者它是一个普通文件但没有足够的字符,那么您得到的将比您要求的少。但是在您询问的情况下,是的,您应该保证获得与您要求的一样多的字符。

尽管如此,如果您发现自己在假设read据称保证读取所请求的字符数与承认它可能返回更少之间做出选择,我总是会编写代码以假设它可能返回更少。也就是说,如果你有一个类似的电话

r = read(fd, buf, n);
Run Code Online (Sandbox Code Playgroud)

通过假设 ifr大于 0,它必须恰好是 ,通常不会有太多收获n。您的代码必须能够处理这种r < n情况,以便在几乎处于文件末尾时它会正常运行,因此除非您想要有两个不同的代码路径(一个用于“正常”读取,一个用于最后一次读取) ,你不妨写一段代码,可以处理这种r < n情况,让它一直运行。

(另外,正如 Zan Lynx 在评论中提醒的那样,不要让代码注意到r < n,并从中推断出文件结尾即将到来。r == 0在决定你在文件结尾之前等待。)