[英]What is the difference between read() and fread()?
我正在阅读 linux 工具badblocks的源代码。 他们在那里使用read()
function。 与标准 C fread()
function 有区别吗? (我没有将 arguments 视为差异。)
read()
是低级别的无缓冲读取。 它对 UNIX 进行直接系统调用。
fread()
是 C 库的一部分,并提供缓冲读取。 它通常通过调用read()
来填充其缓冲区来实现。
家庭read()
-> open
, close
, read
, write
家庭fread()
-> fopen
, fclose
, fread
, fwrite
更多细节在这里,虽然请注意这篇文章包含一些不正确的信息。
我记得read()
级别的 API 不做缓冲 - 所以如果你read()
一次 1 个字节,与使用fread()
做同样的事情相比,你将受到巨大的性能损失。 fread()
将拉出一个块并根据您的要求将其分发出去。 read()
将下降到 kernel 对于每个调用。
read
是一个系统调用,而fread
是 C 标准库中的 function。
如果您将使用一种的代码转换为使用另一种的代码,您应该注意一个区别:
fread
阻塞,直到您请求的字节数被读取,或文件结束,或发生错误。read
也块,但如果您要求说 4kB,它可能会在仅读取 1kB 后返回,即使文件尚未结束。这可能会导致细微的错误,因为它取决于文件的存储位置、缓存等。
read() --> 直接使用此系统调用 kernel 并执行 IO 操作。
fread() --> 是标准库中提供的 function。
调用fread()
主要用于存储结构数据的二进制文件数据。 这两者之间的主要区别在于应用程序中系统调用的数量。
fread()
类型的标准 IO 库函数针对系统调用进行了优化,而不是您的应用程序进行系统调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.