对于文件操作而言:要明白linux下一切皆文件
知识点扩展:先描述后组织
在内核中通常是先对相关数据和对象进行描述,然后再对它们进行组织,这种方式有助于更高效、有序地管理系统资源。以下为你详细解释:
- 先描述:内核需要对系统中的各种实体(如进程、文件、设备等)进行建模和表示。为了做到这一点,首先要定义数据结构来描述这些实体的属性和状态。比如,在 Linux 内核中,使用task_struct结构体来描述进程,这个结构体包含了进程的标识符、状态、优先级、打开的文件描述符等众多信息。通过这样的数据结构,内核能够清晰地记录每个进程的详细情况,就像是给每个进程建立了一个 “档案”。
- 再组织:在对实体进行描述之后,为了便于对它们进行管理和操作,内核需要将这些描述性的数据结构按照一定的方式组织起来。仍然以进程为例,内核会使用链表、树等数据结构来组织所有的task_struct结构体。比如,Linux 内核中使用双向链表将所有的进程控制块链接起来,形成一个进程链表,这样就可以方便地遍历所有的进程,进行诸如调度、资源分配等操作。
先描述再组织的方式使得内核能够以一种结构化和系统化的方式管理系统资源,提高了内核的运行效率和稳定性,也方便了内核的开发和维护。
目标:被打开的文件
cwd:current what director
1.以c语言为主
C程序默认在启动的时候是:会自动打开三个文件分别是in/out/err在底层文件中叫做:键盘文件、显示器文件、显示器文件,对应的下标为0,1,2;
2.文件系统调用
丛上图可以知道文件是在磁盘上的,用户想要打开文件,通过程序,程序通过相应的库函数进行系统调用(操作系统提供)从而进行按照冯诺依曼体系结构进行顺序进行!
库函数的底层实际就是调用的open,open就是系统调用接口!
实现方式
- 数据结构分离:进程管理维护着进程控制块(PCB ,如 Linux 中的 task_struct )等数据结构,记录进程状态、资源占用等信息;文件管理通过 inode、struct file 等数据结构管理文件属性、内容存储等。两者数据结构独立,互不干扰。比如进程管理不直接涉及文件的具体存储细节,文件管理也不关心进程内部的执行逻辑。
- 功能接口独立:进程管理提供进程创建、调度、终止等接口;文件管理提供文件打开、关闭、读写等接口。进程通过文件管理提供的接口来操作文件,而不是直接访问文件管理内部的数据结构和实现逻辑。例如在 Linux 系统中,进程使用 open、read、write 等系统调用来操作文件,这些系统调用是文件管理向外暴露的接口,进程只需遵循接口规范,无需了解文件管理内部如何管理文件的存储和索引。
对于底层而言,其实你不管什么语言调用简单的封装函数实际上都是这些函数在进行调用相应的接口:例如下图的a在C语言里面是追加所以调用的是追加接口
下面是整理的对一些文件标志:
访问模式标志
O_RDONLY
- 含义:以只读模式打开文件,只能对文件进行读取操作,不能写入。
- 示例:
int fd = open("file.txt", O_RDONLY);
O_WRONLY
- 含义:以只写模式打开文件,只能对文件进行写入操作,不能读取。
- 示例:
int fd = open("file.txt", O_WRONLY);
O_RDWR
- 含义:以读写模式打开文件,既可以对文件进行读取操作,也可以进行写入操作。
- 示例:
int fd = open("file.txt", O_RDWR);
行为控制标志
O_TRUNC
- 含义:若文件已存在,并且以写模式(
O_WRONLY
或O_RDWR
)打开,会将文件的长度截断为 0,也就是清空文件内容。 - 示例:
- 含义:若文件已存在,并且以写模式(
int fd = open("file.txt", O_WRONLY | O_TRUNC);
O_EXCL
- 含义:通常和
O_CREAT
一起使用。当O_CREAT
和O_EXCL
同时被设置时,如果文件已经存在,open
函数会失败并返回 -1,这可用于确保文件是新创建的。 - 示例:
- 含义:通常和
int fd = open("file.txt", O_WRONLY | O_CREAT | O_EXCL, 0666);
O_NONBLOCK
或O_NDELAY
- 含义:以非阻塞模式打开文件。在进行 I/O 操作时,如果操作无法立即完成,函数不会阻塞当前进程,而是会立即返回。
- 示例:
int fd = open("file.txt", O_RDONLY | O_NONBLOCK);
O_SYNC
- 含义:使每次写入操作都同步到磁盘,也就是在
write
函数返回之前,数据会被实际写入磁盘。 - 示例:
- 含义:使每次写入操作都同步到磁盘,也就是在
int fd = open("file.txt", O_WRONLY | O_SYNC);
O_DSYNC
- 含义:与
O_SYNC
类似,但只保证数据的同步,不保证文件元数据(如文件大小、修改时间等)的同步。 - 示例:
- 含义:与
int fd = open("file.txt", O_WRONLY | O_DSYNC);
O_RSYNC
- 含义:保证所有的读写操作都是同步的,对于读取操作,会确保数据是从磁盘读取的最新数据。
- 示例:
int fd = open("file.txt", O_RDWR | O_RSYNC);