基础IO及文件系统

一、系统接口介绍
        1. open()命令 模式下:ctrl+v进入visual block模式,然后选择J、K,然后输入大写i,然后输入//,最后按ESC,即可完成批量注释,按u取消。ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意//要选中两个,选好之后按d即可删除注释。
                
#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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值