1.在将open与fopen之前,先讲文件描述符:
当一个可执行程序运行以后,就变成进程,操作系统会为每个进程分配一定的虚拟内存空间,32位操作系统就分配4G。虚拟内存空间结构如下图所示:
1G是内核空间使用,剩余3G为用户空间,虚拟内存就是当物理内存(如内存条)不够时,从磁盘上分配一块空间。为什么要虚拟空间了?因为物理内存一般都很小,当有多进程要执行时,物理内存很快就分配完了,剩余的进程只有等待前面的进程完成以后才能运行,效率很低。使用虚拟内存能够更高效的分配物理内存。
在内核区的进程管理中,有一个文件描述符表。一个进程有一个进程描述符表,最多可以存储1024个文件描述符,每打开一个文件就占用一个文件描述符。
前三个文件描述符被stdin,stdout,stderr占用。
2,讲完文件描述符,正式讲open 与fopen
open为系统函数,fopen为标准c库函数。使用系统函数open返回的是文件描述符,使用c的标准库函数fopen,返回的是文件指针。通过文件描述符才能找到文件在磁盘中对应的位置。
常用的系统函数有:
对于标准c库函数:
返回的是文件指针,其中封装了文件描述符以及缓冲区(在物理内存上)。数据时先写到缓冲区,再写到磁盘。磁盘是机械设备,读写为毫秒级别,而物理内存时电子设备,读写速度为纳米级别。如果对机械硬盘一个一个字符进行读写,速度较慢,可以先都存入缓冲,然后再一起写入到磁盘,能够节省时间,提高直行效率。
通过上面两张图可以发现,标准c库函数先将数据存入buffer中,然后再调用系统函数对磁盘进行读写操作,标准c库函数不能直接对磁盘进行读写。