【发布时间】:2010-10-09 16:58:52
【问题描述】:
我正在阅读linux工具badblocks的源代码。他们在那里使用read() 函数。与标准 C fread() 函数有区别吗? (我没有将论点视为差异。)
【问题讨论】:
我正在阅读linux工具badblocks的源代码。他们在那里使用read() 函数。与标准 C fread() 函数有区别吗? (我没有将论点视为差异。)
【问题讨论】:
read() --> 直接使用这个系统调用内核并执行IO操作。
fread() --> 是标准库中提供的函数。
调用fread()主要用于存储struct数据的二进制文件数据。
这两者之间的主要区别在于您的应用程序中的系统调用数量。
fread() 类型的标准 IO 库函数针对系统调用进行了优化,而不是您的应用程序进行系统调用。
【讨论】:
据我所知,read() 级别的 API 不进行缓冲 - 因此,如果您 read() 一次 1 个字节,与使用 fread() 执行相同操作相比,您将面临巨大的性能损失。 fread() 会在你要求时拉出一个积木并分发出去。 read() 将在每次调用时进入内核。
【讨论】:
家庭read() -> open、close、read、write
家人fread() -> fopen, fclose, fread, fwrite
更多细节here,虽然请注意这篇文章包含一些不正确的信息。
【讨论】:
read() 是低级别的无缓冲读取。它在 UNIX 上进行直接系统调用。
fread() 是 C 库的一部分,提供缓冲读取。它通常通过调用read() 来填充其缓冲区来实现。
【讨论】:
如果您将使用一种的代码转换为使用另一种的代码,您应该注意一个区别:
fread 阻塞,直到您请求的字节数被读取,或文件结束,或发生错误。read 也会阻塞,但如果你要求说 4kB,它可能会在读取 1kB 后返回,即使文件还没有结束。这可能会导致细微的错误,因为它取决于文件的存储位置、缓存等。
【讨论】:
read 是一个系统调用,而fread 是 C 标准库中的一个函数。
【讨论】:
fread 的实现。主要是因为无法保证系统调用read 可用。 Wikipedia read page
read is deprecated。大概是他们的fread 调用_read 而不是read?无论如何,似乎不是每个fread 都必须调用read。