C read()和fread()之间有什么区别?
我正在阅读linux工具的源代码。他们在那里使用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
read()
函数。标准的Cfread()
函数有什么不同吗?(我不把参数计算为差异。)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我已经消除了答案中的大部分误解。