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

C read()和fread()之间有什么区别?,c,file,file-io,C,File,File Io,我正在阅读linux工具的源代码。他们在那里使用read()函数。标准的Cfread()函数有什么不同吗?(我不把参数计算为差异。)read是一个系统调用,而fread是C标准库中的一个函数。read()是一个低级别的无缓冲读取。它在UNIX上直接进行系统调用 fread()是C库的一部分,提供缓冲读取。它通常是通过调用read()来实现的,以填充其缓冲区。我记得read()级别的API不进行缓冲-因此,如果您每次read()1个字节,与使用fread()执行相同操作相比,您将有巨大的性能损失f

我正在阅读linux工具的源代码。他们在那里使用
read()
函数。标准的C
fread()
函数有什么不同吗?(我不把参数计算为差异。)

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

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


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

我记得
read()
级别的API不进行缓冲-因此,如果您每次
read()
1个字节,与使用
fread()
执行相同操作相比,您将有巨大的性能损失
fread()
将根据您的要求拉出一个块并分发出去
read()
每次调用都会转到内核。

系列
read()
->
打开
关闭
读取
写入

系列
fread()
->
fopen
fclose
fread
fwrite

家庭阅读:
  • 是系统调用吗
  • 未格式化IO:我们有一个未格式化的字节流
弗雷德家族
  • 是标准C库(libc)的函数
  • 使用内部缓冲区
  • 为其中一些设置了格式化IO(带有“%..”参数)
  • 始终使用Linux缓冲区缓存

更多详细信息,但请注意,本文包含一些不正确的信息。

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

  • fread
    阻塞,直到您请求的字节数被读取、文件结束或出现错误
  • read
    也会阻塞,但如果请求4kB,即使文件尚未结束,也可能在读取1kB后返回
这可能会导致细微的错误,因为这取决于文件的存储位置、缓存等。

read()-->直接使用此系统调用内核并执行IO操作

fread()-->是标准库中提供的函数

调用
fread()
主要用于存储结构数据的二进制文件数据。 这两者之间的主要区别在于应用程序中系统调用的数量


fread()
这类标准IO库函数针对系统调用进行了优化,而不是针对进行系统调用的应用程序

那么有3个缓冲区?硬盘驱动器有一个,/dev/hda也被缓冲,fread。这是正确的吗?是的。可以使用“fflush”刷新第三个,使用fsync刷新第二个。我不知道如何刷新硬盘缓冲区。fflush()只适用于fwrite(),它与write()的关系与fread()必须读取的关系相同。@Darron我更像一个Linux人,问题是关于Linux的。它可能因操作系统而异,但通常可以假设在Linux中fread调用read.@Jānis Gruzis,这取决于
fread
的实现。主要原因是无法保证系统调用
read
可用@JānisGruzis我刚刚检查了一下窗户上的是否相同,令我惊讶的是我发现了这一点。大概他们的呼叫是读的,而不是读的?在任何情况下,似乎不是每个
fread
都必须调用
read
。read和fread列表中的最后两个要点都是毫无意义的。默认情况下,这两个系列都使用缓冲缓存,使用哪一个与您是访问字符设备、块设备还是常规文件无关。AIB混淆了两层缓冲——内核缓冲在这两种情况下都会发生(我通常称之为Linux缓冲缓存)但是在用户空间中进行缓冲以减少系统调用的总数,我认为只有fread才会这样做。@Marcus我已经消除了答案中的大部分误解。