#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
返回值:成功:新打开的文件描述符失败:-1
mode_t理解:直接 man手册,比什么都清楚。
open 函数具体使用哪个,和具体应用场景相关,如目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限,否则,使用两个参数的open。
二、文件描述符
1.文件描述符表
对Linux进程来讲,每个打开的文件都是通过文件描述符(File Descriptor)来标识的,内核为每个进程维护了一个文件描述符表,这个表以FD为索引,再进一步指向文件的详细信息。在进程创建时,内核为进程默认创建了0、1、2三个特殊的FD,这就是STDIN、STDOUT和STDERR,如下图所示意:
2.文件描述符的分配规则
一个文件被创建成功后,他的返回值表示在文件描述符表中的位置,是从最小的位置开始存放文件地址的。
3.重定向原理
是让已创建的FD指向其他文件。比如,下面是对STDOUT重定向到testfile.txt前后内核文件描述符表变化的示意图:
4.重定向函数---dup2()的系统调用
函数原型:int dup2(int oldfd, int newfd);意为将要赋值的文件地址(old),赋值到被赋值的文件描述表中(new),然后关闭被复制的文件描述符。dup()系列函数主要是为重定向使用的。
5.输入、输出、错误重定向
6.多态的理解,通过OS系统中file结构中的函数指针来调动驱动中的对应的读写方法
三、缓冲区
缓冲区本质上就是一段内存,专门用来做缓存的一块空间,不在磁盘上、不在显示器上、不在网络里。进程为了节省访问IO的时间,通常将数据拷贝到缓冲区中,然后由缓冲区与磁盘进行数据交换。
四、文件系统
4.1 磁盘的物理结构
扇区:磁道与磁道之间的区域,一个扇区512字节,沿径向向外扇区面积变大,但数据总量不变,所以越靠近中心的位置,扇区面积越小,数据密度越大。
磁道:盘面上一圈一圈的同心圆,磁头沿径向运动,则可以读出所处磁道位置。
柱面:上下同直径的磁道形成的面。
磁头:磁头个数等于面数,同时上下磁头是共同进退的。
所以对于多盘面的结构,它的定位方式为:先确定磁道(柱面),再确定磁头(磁头与磁道都有编号的),最后确定扇区。所以磁盘中定义任意一个扇区,采用的硬件基本定位方式:CHS定位法。
4.2 磁盘的逻辑结构
4.2.1 磁盘的抽象化
4.2.2 LBA地址与扇区位置的转换
已知磁盘有6个盘面,7个磁道,1个磁道有120个扇区,数据的LBA为123,求该数据在磁盘中的具体位置。先确定盘面,再确定磁道数,最后确定扇区
123 / (7*120) = 0;含义为:LBA除以一个盘面的总扇区数,确定在哪个盘。有比0大的余数,余1则说明在第二个盘,余2说明在第三个盘。这里为0,说明在第1个盘。
123 / 120 = 1; 含义为:LBA除以一个磁道的总扇区数,确定在哪个磁道。
123 % 120 = 23 含义为:在第一个磁道的第23的位置。
4.2.3