第5章 文件系统的系统调用-1 - Unix操作系统设计-读书笔记

第五章 文件系统的系统调用

先介绍存取已存在的文件的系统调用,如open, read, write, lseek, close

然后介绍创建新文件的系统调用,如creat, mkmod

然后管理索引节点和文件系统的系统调用:chdir, chroot, chown, chmod, stat, fstat

更高级的系统调用:pipe, dup

系统调用mount, umount扩充了对用户可见的文件系统树

link, unlink修改文件系统层次的结构

本章还给出文件系统的抽象表示,是能兼容各种文件系统的关键;

[外链图片转存失败(img-jf3aOM0X-1567144293943)(en-resource://database/3600:1)]

重新强调三个数据结构:

  1. 文件表:系统中每个打开的文件在文件表中都占有一项
  2. 用户文件描述符表:保存在每个进程的数据结构中,表示某个进程打开的文件列表
  3. 安装表:含有每个活动的文件系统的信息,这里的活动是什么意思?进程?

5.1系统调用open

系统调用open的语法格式是:fd=open(pathname, flags, modes)
参数含义:pathname表示文件路径;flags表示打开的类型(读或写);modes给出文件的许可权(如果文件正在被建立);

为什么open是系统调用啊,系统调用到底是什么样的概念?open不是一个函数嘛???

  • open是Linux内核提供给C调用的一个函数
  • 既然是系统提供的,那就称为系统调用????

算法描述

先看下算法open的描述:
[外链图片转存失败(img-QBnxjkEf-1567144293945)(en-resource://database/3602:1)]

  1. 首先调用namei,根据文件名找到索引节点
  2. 然后分配文件表项,文件表项中有一个指针,指向被打开文件的索引节点,其中还有一个域,指示文件中的偏移量;
  3. 还要操作下进程中的那个用户文件描述符表,其中保存文件表中的索引;
  4. 表项的索引就是返回给用户的用户描述符;
  5. 用户文件描述符表中的表项指向对应的全局文件表中的表项

这里面需要强调的是:文件表是全局的,用户文件描述符表是进程的; 其中文件表中保存了偏移量,即每次读从哪里开始,写从哪里开始等;

实例讲解

[外链图片转存失败(img-o90fevMQ-1567144293947)(en-resource://database/3604:1)]
假设第二个进程执行下列代码:
fd1=open("/etc/passwd", O_RDONLY);
fd2=open(“private”, O_RDONLY);
得到如下结果:
[外链图片转存失败(img-2RVXQ4to-1567144293948)(en-resource://database/3606:1)]
注意点:每个open调用都导致在用户描述符表和核心文件表中分配一个唯一表项,但在核心的内容索引节点表中,对每个文件只有一个表项;

这本书里很好的解释了一些设计,比如既然用户文件描述表项和文件表表项一一对应,那么为什么还需要文件表呢?不用文件表,直接让用户文件表项和索引节点表项相互关联不就完事了嘛?

  • Thompson指出,将文件表作为一个独立的数据机构来实现,是为了在若干用户文件描述符之间能够共享偏移量指针;
  • 这里的含义能大概猜测下,即通过系统调用复制用户文件描述符,这样多个用户文件描述符指向同一个文件表项,也就共用了偏移量指针;
  • 之后介绍
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值