Unix fread()/fwrite中使用的缓冲区与read()/write()中使用的缓冲区有何不同?

Unix fread()/fwrite中使用的缓冲区与read()/write()中使用的缓冲区有何不同?,unix,Unix,fread()的语法是 而read()则是 它们都使用缓冲区来放置读取的数据。这两个有什么不同? 我的问题源于术语“用于fread()/fwrite()stdio调用而不用于系统调用的缓冲I/O”。fread可以有自己的缓冲区,而read除了您提供给它的缓冲区外没有其他缓冲区。因此,read是无缓冲的:您只是提供了一个可以进行读取的内存位置,但是stdio函数(通常)是为您缓冲的 例如,fgets不会逐字节读取(因为这样效率很低)。相反,它会分块阅读,有时可能读得太多,超过换行符。然后,读取缓冲

fread()的语法是

而read()则是

它们都使用缓冲区来放置读取的数据。这两个有什么不同?
我的问题源于术语“用于fread()/fwrite()stdio调用而不用于系统调用的缓冲I/O”。

fread
可以有自己的缓冲区,而
read
除了您提供给它的缓冲区外没有其他缓冲区。因此,
read
是无缓冲的:您只是提供了一个可以进行读取的内存位置,但是stdio函数(通常)是为您缓冲的


例如,
fgets
不会逐字节读取(因为这样效率很低)。相反,它会分块阅读,有时可能读得太多,超过换行符。然后,读取缓冲区中会有一些数据等待,
fread
可能会在没有系统调用的情况下立即返回。

Wait,
read
没有缓冲?手册页没有提到它。你怎么知道的?(为什么在谷歌上搜索这么难?!)好吧,没有缓冲关于fd的用户土地视图。fd是一种抽象(比如tap,对美国人来说是水龙头?),tap是内核和代码之间的边界
read(2)
是无缓冲的,因为任何输出的数据都是新传输到进程中的数据:对于应用程序来说,这些数据只是刚刚出现的(据我们所知,网卡在板上处理TCP,并将DMA直接传输到应用程序的RAM中)。作为一个实现细节,内核可能也有一个缓冲区,但是从概念上讲,
read
确实是无缓冲的。另外,我是怎么知道的?因为fds就是这样工作的。还需要指出的是,对
read
的一些调用肯定没有缓冲:例如,特殊的设备节点和/proc可以立即完成读取。内核是否有自己的用于fd读取的缓冲区不是您可以在应用程序中找到的。
size_t fread(void *buf,size_t size, size_t, count, FILE *stream);
ssize_t read(int fd, void *buf, size_t len);