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

Geo*_*lly 48 c file-io file

我正在阅读linux工具badblocks的源代码.他们在read()那里使用这个功能.标准C fread()功能有区别吗?(我不认为这些论点是不同的.)

Dar*_*ron 56

read()是低级无缓冲读取.它在UNIX上进行直接系统调用.

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

  • 是.您可以使用"fflush"刷新第三个,第二个使用fsync.我不知道如何刷新硬盘缓冲区. (5认同)
  • fflush()只适用于fwrite(),它与write()具有相同的关系,fread()必须读取(). (3认同)
  • 所以有3个缓冲区?硬盘有一个,/dev/hda 也有缓冲和 fread。这样对吗? (2认同)

AIB*_*AIB 36

Family read() - > open,close,read,write
Family fread() - > fopen,fclose,fread,fwrite

家庭阅读:

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

家庭恐惧

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

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

  • read和fread列表中的最后两个要点都是无意义的.默认情况下,两个系列都使用缓冲区缓存,而使用哪个系列与访问字符设备,块设备或常规文件无关. (6认同)
  • AIB 混淆了两层缓冲——内核缓冲在两种情况下都会发生(我通常称之为 Linux 缓冲区缓存),但缓冲是在用户空间中完成的,以减少系统调用的总数,我认为只发生在 fread 中。 (4认同)

phi*_*hag 8

read是一个系统调用,而是freadC标准库中的一个函数.


Joe*_*Joe 7

我记得它的read()级API不做缓冲 - 所以如果你一次读取()1个字节,那么与使用fread()做同样的事情相比,你会有很大的性能损失.当你要求它时,fread()会拉出一个块然后把它抽出来.对于每次调用,read()都会进入内核.


Tor*_*erg 5

如果您要将使用其中一种的代码转换为使用另一种,您应该注意一个区别:

  • fread阻塞,直到读取了您请求的字节数,或者文件结束,或者发生错误。
  • read也会阻塞,但如果你要求说 4kB,它可能会在读取 1kB 后返回,即使文件尚未结束。

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