在UNIX系统中,open和fopen系统调用都用于打开文件,但他们的缓冲机制不同。
open系统调用是一种底层的系统调用,用于打开文件并返回一个文件描述符。它不涉及任何缓冲机制,所以是无缓冲IO。
fopen是一个更高层的函数,它是基于标准C库实现的,提供了更丰富的文件操作函数。fopen函数打开一个文件,并返回一个FILE指针。
FILE指针是一个抽象数据类型,封装了底层的文件描述符以及一些缓冲区信息。fopen函数提供了缓冲机制,这是因为标准C库会为每一
个FILE对象分配一个缓冲区,并在需要时将缓冲区的信息写入磁盘。所以fopen函数是又缓冲IO.
需要注意的是,无缓冲IO和有缓冲IO所指的是数据在内存和外部设备之间传输时是否使用缓冲机制,而不是在哪个层次上使用缓冲机制。
在底层系统调用中,操作系统内核会直接将数据从内存复制到外部设备中,不会使用任何缓冲机制,所以是无缓冲IO.而在C标准库中,使
用了缓冲区来缓存数据,所以是有缓冲IO.
缓冲从区别上来看可以简单看作是用户态文件缓冲区/文件流/FILE
对于磁盘文件的读写只有内核态空间才有操作权限(内存分为内核态空间和用户态空间),open就是创建一个文件对象,
分配一个文件描述符。这个文件对象在内核态空间,即对应了一个磁盘文件,我们通过文件描述符对其操作,即完成了对
磁盘文件的读写。文件描述符类似于一个指针,指向了你要操作的文件对象。