删除线格式 ## 文件描述符
1.文件=文件内容+文件属性。
2.文件操作=文件内容的操作+文件属性的操作。
3.所谓的“打开”文件,是指将文件的属性或内容加载到内存中—这是由冯诺依曼决定。
4.所以文件不全打开,不打开的文件放在磁盘存储。
5.内存文件(内存文件)和磁盘文件。
6.当代码运行,才是真正的对文件进行相关的操作。
1.默认文件在哪形成? 当前路径:当前进程
2.常见的记住文件属性
r读,w写,r+与w+都可以读写,当w+多了如果文件不存在多了一个文件创建的功能。a(追加写入,不断往文件新增内容,如果文件为空创建新文件)、a+
a的追加
当我们以w的方式打开文件,准备写入的时候,文件已经先被清空了。
我们向文件进行写入的时候最终是磁盘保存所以是向磁盘写入。磁盘是硬件由os提供的相关系统调用。
操作系统打开文件open头文件#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
open创建文件使用
我们创建不存在的文件使用上图第二个系统函数,mode是我们赋予文件的权限。pathname文件名。如果文件存在使用2个参数的open。
关闭文件close
往文件里写入东西write
buf是字符串的起始地址
读文件
3.文件清空的问题?
默认情况下文件不会被情况,我们需要在open里填入0_TRUNCl来截断清空。
而文件操作符从3开始,0(stdin):标准输入,键盘(stdout)1:标准输出,显示器(stderr)2.标准错误,显示器。这就是未什么fd为3的原因。
0号接口的使用:
1号接口的使用:
linux下一切皆文件:
os内的存储文件结构体由文件属性和文件方法组成。像外设它有它对应的读写方法,键盘,显示器,网卡等读写方法都不一样。进程获取时调用不同数据结构来控制对应的外设进行工作。整个结构是通过stuct_file链接起来的。每个文件有对应fd号。我们需要的时候os就去找对应的fd或者设备。很像c++的多态。(驱动控制读写)
1.文件描述符的分配规则
:从头遍历数组fd_array[]找到一个最小的,没有被使用的下标,分配给新的文件。
2.重定向的本质
在操作系统里,fd上层只认fd的id,我们在os内部,通过调整特定下标的指向,我们就可以完成重定向操作。
oldfd是新的fdnewfd是旧的fd。dup2(fd,1);
追加重定项 指在文件里面增加内容。
3.理解缓冲区
1.缓冲区就是一段内存
2.为什么要有缓冲区
a.解放使用缓冲区的进程时间
b缓冲区可以集中处理数据刷新,减少IO的次数,从而达到提高机子的效率。
3.缓冲区由语言提供,语言界别的缓冲区。系统级别的缓冲区会立马显示出来。
一、刷新的本质:把缓冲区的数据写到OS内部,再清空缓冲区。
二、缓冲区,是自己的fie内部进行维护,属于父进程内部的数据区域
重定向: ls -a -l > log.txt -> ls -a -l\0 logtxt
上面指令:\0前面的那部分继续进行指令分析后半部分负责打开文件重定向工作。
输入重定向
cat < log.txt
追加hello至log.xt文件
echo hello >> log.txt
重定向方案这边做了两次。 ./a,out 1>stdout.txt 2>stderr.txt这条指令
标准输出标准错误分开打印。由于区分程序日常输出哪些是错误。
如果不想分别打印可以采用下图命令
./a.out > all.txt 2>&1
这命令的意思是将1的内容拷贝到all.txt里面,这是因为重定向的原因导致指向不在原来位置所以需要&。2是指向显示器,此时1和2指向同一个位置。
文件系统
1️⃣ 磁盘的物理结构
2️⃣ 磁盘的存储结构
3️⃣ 磁盘的逻辑抽象结构