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

我正在阅读Linux工具badblocks的源代码。 他们在那里使用read()函数。 与标准的C fread()函数有区别吗? (我没有把这个论点算在一起。)

read()是一个低级别,无缓冲的读取。 它在UNIX上直接进行系统调用。

fread()是C库的一部分,并提供缓冲读取。 通常通过调用read()来填充缓冲区来实现。

家庭读() – > 打开,closures,读,写
家庭fread() – > fopen,fclose,fread,fwrite

家庭阅读:

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

家庭fread

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

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

read是一个系统调用,而fread是C标准库中的一个函数。

我记得read()级别的API不会执行缓冲 – 所以如果你每次读取()1个字节,与使用fread()做同样的事情相比,你会有很大的性能损失。 fread()将会拉出一个块,并在你请求的时候将其释放。 每次调用read()都会放到内核中。

一个区别是你应该知道,如果你正在转换代码使用一个使用另一个:

  • fread块,直到您请求的字节数已被读取,或文件结束,或发生错误。
  • read也块,但如果你要求说4kB它可能会返回后,只读1kB,即使该文件还没有结束。

这可能会导致微妙的错误,因为它取决于文件的存储位置,caching等。