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等。