目录
简单理解文件
1、文件宏观理解:文件是在磁盘上存储的,对文件的操作,本质是对外设的输入输出
2、文件 = 属性 + 内容,空文件也占用空间,源于属性占用磁盘空间
3、文件的读写操作是由进程来完成的,上层调用的C语言接口是系统函数封装的
C语言简单函数
w方式写:写入,每次写入都是重新写入,之前的文件内容会被清空
a方式写:append,追加写,本质也是写入,不清空原始文件,在文件的最后写入
这里不加./也可以运行,源于进程cwd指明当前路径
1、stdin & stdout & strerror
Linux系统下一切皆文件,
常见的C语言函数
为什么所有语言都要提供默认的标准输入、标准输出、标准错误呢,语言都需要交互,不打开这些文件接口,无法交互
2、站在系统角度理解文件
1、文件和进程的关系
2、系统调用
常见linux系统接口
open
flags有以下几种,mode是文件权限,比如664等
fd,返回成功大于0,失败-1
close
read
返回读取的字节数
write
成功返回写的字节数,失败返回-1
fd文件描述符,数组下标
使用read,read是那个进程调用的,通过那个进程找到files_struct,找到fd,拿到struct file,执行对应read
没有从定向原因,标准错误的fd是2,>符号改的是1里面的,所有没成功
写时拷贝
重定向函数
>,对应于dup2(fd,1),<<只是相当于多一个append追加形式重定向
<,对应于dup2(fd,0)
重定向和程序替换不相干
文件系统
文件分为打开的文件,类似于进程打开的,文件被加载到内存上,此外还有普通的未被打开的文件
未被打开的文件位于磁盘上面,文件系统既要管理打开的文件也要管理未被打开的文件。
磁盘的一个扇区大小为512字节,通常内存单位为4kb,所以通过OS完成IO需要以8个扇区也就是521字节为单位进行交互。
1、 目录分为普通文件和目录文件,一个文件一个inode
2、inode里面包含了文件的属性集合,里面还有一个block数组,数组里面对应着使用了那些数据块
3、系统里面通过inode标识文件
如何找到一个文件?打开它读取数据?
文件的inode和文件名的映射关系存在于目录的数据块中,所以只要找到目录的inode就行了,如何查找目录的inode,系统依次往上查找,找到根目录,最终找到该目录的inode号,并保存起来,所以这样依次查找最终找到了文件的inode,通过inode拿到文件的数据块,最终找到文件的数据
硬盘中如何创建一个文件,过程是啥?
先找到分区和块组,给这个文件分配inode,在inode位图里面找一个没有被使用的,将文件的属性写入inode,再在块位图里面找一个没有被使用的,将文件数据写入到datablock中,再将块位图找到的那个位置写入到文件的inode中的映射关系中
为什么大多数OS同一个目录中,不允许存在同名文件?
因为目录的数据块存储的是文件名到inode id的映射,如果文件名相同就会出现二义性,不知道找到是哪个映射关系
如何删除文件?
只要将inode和对应的数据块位图删除即可