我正在阅读linux工具badblocks的源代码.他们在read()那里使用这个功能.标准C fread()功能有区别吗?(我不认为这些论点是不同的.)
Dar*_*ron 56
read()是低级无缓冲读取.它在UNIX上进行直接系统调用.
fread()是C库的一部分,并提供缓冲读取.它通常通过调用read()来实现,以填充其缓冲区.
AIB*_*AIB 36
Family read() - > open,close,read,write
Family fread() - > fopen,fclose,fread,fwrite
这里有更多细节,但请注意这篇文章包含一些不正确的信息.
我记得它的read()级API不做缓冲 - 所以如果你一次读取()1个字节,那么与使用fread()做同样的事情相比,你会有很大的性能损失.当你要求它时,fread()会拉出一个块然后把它抽出来.对于每次调用,read()都会进入内核.
如果您要将使用其中一种的代码转换为使用另一种,您应该注意一个区别:
fread阻塞,直到读取了您请求的字节数,或者文件结束,或者发生错误。read也会阻塞,但如果你要求说 4kB,它可能会在读取 1kB 后返回,即使文件尚未结束。这可能会导致细微的错误,因为这取决于文件的存储位置、缓存等。