成都市建设局官方网站山西百度推广开户
目录
前言
一.文件操作
系统调用接口
1.打开文件
2.关闭文件
3.读取文件
4.写入文件
二.文件描述符
重定向
三.动静态库
前言
在Linux操作系统中,文件I/O是一个核心概念,涉及如何读写文件、与设备通信以及如何管理数据流。Linux下一切皆文件, 文件I/O在Linux中有着统一的接口
一.文件操作
系统调用接口
1.打开文件
pathname: 表示要打开的一个文件路径
flags: 表示打开方式,常用的有以下选项
- O_CREAT: 不存在就创建
- O_WRONLY: 以读方式打开
- O_RDONLY: 以写方式打开
- O_TRUNC: 如果存在就清空
- O_APPEND: 以追加方式打开
mode: 表示创建文件的属性
如果打开成功, 返回一个文件描述符, 打开失败, 返回-1并设置错误码
2.关闭文件
关闭一个文件描述符
3.读取文件
从指定的一个文件描述符中读数据
- fd: 文件描述符
- buf: 读取目的地的起始地址
- count: 最大读取字节数
返回实际读取字节数
4.写入文件
从指定的一个文件描述符写数据
- fd: 文件描述符
- buf: 写入数据的起始地址
- count: 最大读取字节数
返回实际写入字节数
二.文件描述符
在上述接口, 都依赖于一个叫文件描述符的整形变量, 那么一个整形变量如何表示一个文件, 我们先看看操作系统是如何管理打开的文件的
打开一个文件, 要将这个文件加载到内存, 这个文件也叫内存级文件, 在操作系统中有这些文件的数据结构struct file, 里面包括了这个文件的各项属性,以及读写操作方法, 用特定的数据结构管理这些struct file就实现了对打开的文件的管理
在进程的PCB中, 保存了该进程打开的文件的信息, struct files_struct
是一个与文件描述符表相关的结构体,它包含了文件描述符表的指针、引用计数,以及一些用于并发控制的字段
文件描述符表是一个数组,存储着所有打开的文件描述符对应的 struct file指针。这些指针指向打开的文件的struct file, 而这个数组的下标就是文件描述符, 通过下标能找到对于的文件
一个进程, 会默认打开三个文件, 标准输入, 标准输出, 标准错误, 它们对应的文件描述符为0/1/2, 然后新打开的文件的文件描述符会继续顺序下去分配
重定向
重定向是指将程序的输入或输出从默认位置(如终端)转移到其他地方(如文件、设备或另一程序)的过程, 从文件描述符表来看, 就是将原本的数组里的指针替换, 比如将标准输出重定向到一个文件
重定向前
重定向后
当我们使用printf,cout之类的接口时, 会默认向标准输出打印, C/C++有自己封装的文件结构, 但其中的属性一定包含了文件描述符, 默认向标准输出打印, 标准输出文件描述符已经被替换为一个文件, 就打印到了文件里
三.动静态库
- 静态库(.a):静态库是在编译时被链接到目标程序中的库。当程序被编译时,静态库中的所有代码都会复制到目标程序中,形成一个独立的可执行文件。由于所有库代码在编译时已经被整合到可执行文件中,因此运行时不再需要库的存在。
- 动态库(.so):动态库是在程序运行时被加载的库,而不是在编译时被链接到目标程序中。动态库的代码不被复制到可执行文件中,而是程序在运行时需要动态库的支持。程序在启动时或在运行过程中,动态库会被加载到内存中,供程序调用。
动态库的原理
动态库通过页表可以映射到多个进程的进程地址空间的共享区