繁体   English   中英

read() 和 fread() 有什么区别?

[英]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() -> fopenfclosefreadfwrite

家人朗读:

  • 是系统调用
  • 未格式化 IO:我们有一个未格式化的字节 stream

家庭恐惧症

  • 是标准 C 库 (libc) 的函数
  • 使用内部缓冲区
  • 其中一些被格式化为 IO(带有“%..”参数)
  • 始终使用 Linux 缓冲区缓存

更多细节在这里,虽然请注意这篇文章包含一些不正确的信息。

我记得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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM