Linux内核文件系统的底层调用

底层系统调用

open系统调用

​ open可以创建一个新的描述符,成功返回文件描述符,失败返回-1,通常open系统调用不需要头文件sys/stat.hsys/types.h但在某些UNIX系统上,它们必不可少,如果两个程序同时打开一个文件,它们会分别得到两个不同的文件描述符。如果它们都对文件进行写操作,那么它们会各写各的,分别接着上次离开的位置继续往下写。数据不会交织,而是彼此覆盖。两个程序对文件读写位置(偏移值)不同。可以通过使用文件锁防止这种现象出现。

​ O_APPEND:把写入数据追加在文件末尾;

​ O_TRUNC:把文件长度设置为0,丢弃已写内容;

​ O_CREAT:如果需要,就按参数mode中给出的访问模式创建文件;

​ O_EXCL:与O_CREAT一起使用,确保调用者创建出文件。OPen调用是一个原子操作,也就是说,它只执行一个函数调用。使用这个可选模式可防止两个程序同时创建一个文件。

​ S_IR(orW\X)USR 创建者权限

​ S_IR(orW\X)GRP用户组权限

​ S_IR(orW\X)OTH其他人权限

#include"fcntl.h"
#include"sys/types.h"
#include"sys/stat.h"

int open(const char *path ,int oflag);		//path是文件路径,oflag通过必需文件访问模式和其他可选模式相结合的方式来指定
int open(const char *path ,int oflag,mode_t mode);	//mode参数在头文件"sys/stat.h"中定义用于和O_CREAT联合使用创建文件

文件描述符" 0 & 1 & 2 " 及 " 分配规则 "

Linux 进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入 0, 标准输出 1, 标准错误 2
对应的物理设备一般是:
标准输入 0 —> 键盘
标准输出 1 —> 显示器
标准错误 2 —> 显示器

文件描述符的分配原则是从未分配的最小的描述符开始分配

write系统调用

​ 系统调用write的作用是把缓冲区的buf的前nbytes个字节写入文件描述符关联的文件中,它返回实际写入的字节数。如果文件描述符有误或者设备驱动程序对数据块长度比较敏感,该返回值可能会小于nbytes。函数为0,就表示未写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误;错误代码保存在全局变量errno中;

#include"unistd.h"

size_t write(int fildes,const void * buf ,size_t nbytes)

read系统调用

​ read的作用是:从与文件描述符fildes相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。它返回实际读入的字节数,这可能会小于请求的字节数。返回-1表示调用出现错误。

#include"unistd.h"

size_t read(int fildes,const void * buf ,size_t nbytes)

close系统调用

​ close调用用于终止文件描述符fildes与其对应文件之间的关联,文件描述符释放可以重新使用,检查close调用的返回结果十分重要,有的文件系统,特别是网络文件系统,可能不会在关闭文件前报告写操作出现的错误,这是因为在执行写操作数字未被确认写入。

ioctl系统调用

​ ioctl调用是个大杂烩,它提供了控制设备及其描述符行为和配置底层服务的接口。终端、文件描述符、套接字都可以有为它们定义的ioctl,具体细节可以参考设备手册,ioctl调用

lseek系统调用

​ lseek系统调用对文件描述符fildes的读写指针进行设置,也就是说,你可以用它来设置文件的下一个读写位置,可以设置为,文件中的某个绝对位置相对位置或者文件尾的某个相对位置

#include"unistd.h"
#include"sys/types.h"

off_t lseek(int fildes ,off_t offset ,int whence);

​ offset参数用来指定位置,而whence参数定义该偏移值的用法。whence可以取下列值之一

  • SEEK_SET:offset是绝对位置;
  • **SEEK_CUR:**offset是相对当前位置的一个相对位置;
  • **SEEK_END:**offset是相对于文件尾的一个相对位置。

lseek返回从头文件到头指针被设置处的字节偏移值,失败时返回-1,参数offset的类型off_t是一个与具体实现有关的整形,定义在sys/types.h中

fstat、stat和lstat系统调用

​ fstat系统调用返回与打开的文件描述符相关的文件的状态信息,该信息将会写到一个buf结构中,buf的地址以参数的形式传递给fstat

#include"unistd.h"
#include"sys/stat.h"
#include"sys/types.h"

int fstat(int fildes,struct stat *buf);
int stat(const char *path,struct stat *buf);
int lstat(const char *path, struct stat *buf);

​ stat和lstat是通过文件名查到的状态信息,结果相同,但如果文件是一个链接时,lstat返回的是该符号链接本身的信息,stat返回是该链接指向文件的信息。

dup和dup2系统调用

​ dup系统调用提供了一种复制文件描述符的方法,使我们能够通过两个或者更多个不同的描述符来访问同一个文件,这可以同时在文件不同位置对数据进行读写,dup系统调用复制文件描述符fildes,返回一个新的描述符。dup2系统调用则是明确指定目标描述符来把一个文件描述符复制为另一个。

#include"unistd.h"

int dup (int fildes);
int dup2 (int filde,int fildes2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 1 虚拟文件系统概述 5 1.1 通用文件模型 7 1.2 VFS所处理的系统调用 9 2 虚拟文件系统架构 11 2.1 VFS对象数据结构 11 2.1.1 超级块对象 11 2.1.2 索引节点对象 15 2.1.3 文件对象 18 2.1.4 目录项对象 22 2.2 把Linux中的VFS对象串联起来 24 2.2.1 与进程相关的文件 25 2.2.2 索引节点高速缓存 29 2.2.3 目录项高速缓存 30 2.2.4 VFS对象的具体实现 32 2.3 文件系统的注册与安装 38 2.3.1 文件系统类型注册 38 2.3.2 文件系统安装数据结构 41 2.3.3 安装普通文件系统 52 2.3.4 分配超级块对象 58 2.3.5 安装根文件系统 60 2.3.6 卸载文件系统 65 2.4 路径名的查找 66 2.4.1 查找路径名的一般流程 67 2.4.2 父路径名查找 82 2.4.3 符号链接的查找 84 2.5 VFS系统调用的实现 88 2.5.1 open()系统调用 88 2.5.2 read()和write()系统调用 96 2.5.3 close()系统调用 97 3 第二扩展文件系统 99 3.1 Ext2磁盘数据结构 101 3.1.1 磁盘超级块 102 3.1.2 组描述符和位图 105 3.1.3 磁盘索引节点表 105 3.2 VFS接口数据结构 110 3.2.1 Ext2 超级块对象 110 3.2.2 Ext2 的索引节点对象 121 3.2.3 创建Ext2文件系统 124 3.2.4 Ext2的方法总结 126 3.3 Ext2索引节点分配 129 3.3.1 创建索引节点 130 3.3.2 删除索引节点 143 3.4 Ext2数据块分配 144 3.4.1 数据块寻址 145 3.4.2 文件的洞 147 3.4.3 分配数据块 148 4 页面高速缓存 160 4.1 页高速缓存数据结构 160 4.1.1 address_space对象 161 4.1.2 基树 164 4.2 高速缓存底层处理函数 166 4.2.1 查找页 166 4.2.2 增加页 168 4.2.3 删除页 173 4.3 文件系统与高速缓存 175 4.3.1 缓冲头数据结构 175 4.3.2 分配块设备缓冲区页 178 4.3.3 释放块设备缓冲区页 184 4.4 在页高速缓存中搜索块 185 4.4.1 __find_get_block()函数 185 4.4.2 __getblk()函数 188 4.4.3 __bread()函数 190 4.5 把脏页写入磁盘 191 4.5.1 pdflush内核线程 192 4.5.2 搜索要刷新的脏页 193 4.5.3 回写陈旧的脏页 196 5 文件读写 199 5.1 系统调用VFS层的处理 200 5.2 第二扩展文件系统Ext2层的处理 201 5.2.1 Ext2的磁盘布局 202 5.2.2 Ext2的超级块对象 206 5.2.3 Ext2索引节点对象的创建 210 5.2.4 Ext2索引节点对象的读取 218 5.2.5 Ext2层读文件入口函数 225 5.3 页高速缓存层的处理 237 5.3.1 创建一个bio请求 238 5.3.2 得到文件的逻辑块号 244 5.3.3 普通文件的readpage方法 251 5.3.4 块设备文件的readpage方法 252 5.3.5 文件的预读 260 5.4 通用块层的处理 264 5.4.1 块设备的基础知识 265 5.4.2 通用块层相关数据结构 269 5.4.3 提交I/O传输请求 271 5.4.4 请求队列描述符 273 5.5 块设备I/O调度层的处理 281 5.5.1 块设备的初始化 284 5.5.2 建立块设备驱动环境 288 5.5.3 关联block_device结构 295 5.5.4 为设备建立请求队列 306 5.5.5 块设备I/O调度程序 311 5.5.6 真实的I/O调度层处理 321 5.6 块设备驱动层的处理 330 5.6.1 scsi总线驱动的初始化 330 5.6.2 scsi设备驱动体系架构 342 5.6.3 scsi块设备驱动层处理 347 5.6.4 scsi命令的执行 369 5.6.5 scsi命令的第一次转变 372 5.6.6 scsi命令的第二次转变 380 5.7 写文件 384 5.7.1 generic file_write函数 384 5.7.2 普通文件的prepare_write方法 386 5.7.3 块设备文件的prepare_write方法 387 5.7.4 将脏页写到磁盘 388 6 直接I/O与异步I/O 391 6.1 直接I/O 391 6.2 异步I/O 393 6.2.1 Linux 2.6中的异步I/O 394 6.2.2 异步I/O环境 394 6.2.3 提交异步I/O操作 395

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值