访问文件前,为什么必须要打开文件?/ 打开文件的实质
访问文件前,都必须先打开它, 如fopen
访问文件时,是进程在访问
所以文件必须加载到内存中
我们要访问文件时,一定要通过内存访问
文件没有被打开时,在磁盘上
打开文件就是把文件加载到内存中
所以, 访问文件前, 一定要先打开文件
打开文件就是把文件加载到内存中
fopen open read ...
fopen封装了open,
w:清空文件/新建文件
open的flags参数通过位图传参
open的mode参数设置权限(0666)
umask,系统和进程各有一个,进程内修改umask可不影响系统
open返回值是个整数
失败是-1
OS如何管理加载到内存中的文件
内存中有struct file
每个描述一个打开的文件的属性
所有的struct file构成了file list
先描述,再组织
文件=属性+内容
内核中,文件=文件的内核数据结构+文件的属性
每个进程默认会打开三个输入输出流
stdin stdout stderr
C库函数一定是封装系统调用实现的
封装后虽然方便,但有时会不灵活
fd
fd:文件描述符
fd从3开始:每个进程默认启动三个标准输入
stdin 0
stdout 1
stderr 2
read用法
进程与文件的关系(file list & task list)
我们研究打开的文件,是在研究:进程和文件的关系
task_list和file_list隶属于两个不同模块
一个进程可以打开多个文件,
每个task_struct存在struct file_struct* files
是一个指针数组
指针数组元素:struct file*,指向file list元素
fd即文件指针数组的下标
在系统层面,fd是访问文件唯一方式
FILE & FILE*实质
FILE : struct file
FILE* : strct file*
tips:
空文件也会占用磁盘空间(文件属性)
资源管理器只显示了内容大小, 不包含文件属性、
没有被打开的文件:只在磁盘当中