文件操作总结
1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件
2.文件系统
3.动静态库 – a.制作者的角度 b.站在使用者的角度 c.如何理解动态库加载(进程地址空间的内容)
预备知识
1.你真的理解文件原理和操作了吗?这不是语言问题,这是系统的问题
2.是不是只有c/c++有文件操作呢?pytho java php go也有的,但是他们的文件操作的方法是不一样的,如何理解这种现象?有没有一种统一的视角看待所有的语言文件操作呢
3.操作文件的时候,第一件事情,都是打开文件.打开文件是做什么呢,如何理解呢
4.文件 = 内容 + 属性->针对文件的操作,对内容的操作,对属性的操作
5.当文件没有被操作的时候,文件会在磁盘上
6.当我们对文件进行操作时,文件会被放在内存上,因为冯诺依曼体系是这么规定的
7.当我们对文件进行操作时,文件需要提前被load到内存,load的是内容还是属性呢?反正至少得有属性吧
8.当我们对文件进行操作时,文件需要提前被load到内存,是不是只有你一个人在load呢?不是,内存中一定存在大量的不同文件的属性
9.综上->打开文件本质就是将我们需要的文件属性加载到内存中,OS内部一定会同时存在大量的被打开的文件,那么OS要不要管理这些被打开的文件呢?先描述,再组织!构建在内存中的文件对象结构体,struct file{就可以从磁盘来,struct file* next}
,表明被打开的文件
10.文件被打开,是谁在打开呢?OS,但是是谁让OS打开的呢? 用户(进程为代表的)
11.我们之前的所有的文件操作,都是进程和被打开文件的关系
12.进程和被打开文件的关系struct task_struct
和struct file
的关系
结论:
- 每一个被打开的文件,都要在OS内创建对应的struct结构体,可以将所有的
struct file
结构体用某种数据结构链接起来,在OS内部,对被打开的文件进行管理,就被转换为了对链表的增删查改
即:文件被打开,OS要为被打开的文件创建对应的内核结构
struct file
{
//各种属性
//各种链接关系
}
- 文件其实可以被分成两大类:磁盘文件,被打开的文件(内存文件)
C文件操作回顾
语言方案
w写入方式
w: 默认写方式打开文件,如果文件不存在,就创建它
1.默认如果只是打开,文件内容会自动清空
2.同时,每次进行写入的时候,都会从最开始进行写入
先清空,再写入
#include<stdio.h>
#define LOG "log.txt"
int main()
{
FILE* fp = fopen(LOG,"w");
if(fp == NULL)
{
return perror("fopen");
//fopen:xxxx
return 1;
}
//正常进行文件操作
const char* msg = "hellp lx,hello 2023\n";
int cnt = 5;
while(cnt)
{
char buffer[256];
//int fprintf(FILE* stream,const char* format,...)
//指定文件流,向指定文件打印
fprintf(fp,"%s:%d:lx\n",msg,cnt)//往文件中输入
fprintf(stdout,"%s:%d:lx\n",msg,cnt)//linux一切皆文件,stdout对应显示器文件
snprintf(buffer,sizeof(