fd=fopen()是一个系统调用。用于依据文件名称打开一个文件。返回该文件的文件描写叙述符,文件打开后进程便能够依据文件描写叙述符fd进行其它操作,比方读,写,关闭等操作。

各个操作系统打开文件的过程是类似的,本文以Unix为例,介绍打开一个文件操作系统所做的工作。正式介绍这个过程之前先简要介绍几个概念。

PCB(process control block)进程控制块。它是一个内核数据结构,相当于一个档案,是操作系统感知进程存在的唯一标识。包含进程状态,进程id,PC,寄存器,内存信息,文件打开信息等,例如以下图所看到的

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

FCB(file control block)文件控制块,是文件系统的一部分。在磁盘上通常会创建一个文件系统,文件系统中包括文件夹信息。以及文件的FCB信息。FCB一半包括文件的读写模式。全部者,时间戳,数据块指针等信息。unix的FCB称为inode。其结构例如以下图所看到的

本图片来自http://codex.cs.yale.edu/avi/os-book/OS9/slide-dir/os-figures.zip

文件打开的步骤例如以下图所看到的(从右往左看)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

首先,操作系统依据文件名称a,在系统文件打开表中查找

第一种情况:

假设文件a已经打开。则在进程文件打开表中为文件a分配一个表项,然后将该表项的指针指向系统文件打开表中和文件a相应的一项;

然后再PCB中为文件分配一个文件描写叙述符fd,作为进程文件打开表项的指针,文件打开完毕。

另外一种情况:

假设文件a没有打开。查看含有文件a信息的文件夹项是否在内存中。假设不在,将文件夹表装入到内存中,作为cache。

依据文件夹表中文件a相应项找到FCB在磁盘中的位置。

将文件a的FCB装入到内存中的Active inode中。

然后在系统文件打开表中为文件a添加新的一个表项,将表项的指针指向Active Inode中文件a的FCB;

然后在进程的文件打开表中分配新的一项,将该表项的指针指向系统文件打开表中文件a相应的表项。

然后在PCB中,为文件a分配一个文件描写叙述符fd,作为进程文件打开表项的指针,文件打开完毕。

文件打开的过程——调用fd=open()时操作系统所做的工作的更多相关文章

  1. 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器

    [源码下载] 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件打开选取器 示例1.演示如何 ...

  2. linux下系统启动时,几个配置文件 /etc/profile、~/.bash_profile 等几个文件的执行过程,先后顺序

    1. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时, 首先启动 /etc/profile 文件, 然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login ...

  3. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  4. excel双击文件打开时空白,使用菜单打开正常的解决办法

    excel双击文件打开时空白,使用菜单打开正常的解决办法 打开 excel的选项 找到高级->常规 取消“忽略使用动态数据交换...”的勾,确定. 问题解决.

  5. 关于各种文件用Editplus的方式打开出现“向程序发送命令时出现问题”的解决方法

    其实网上有很多解决方法,但是我试过都没有用. 我出现这个错误的原因是因为我的Editplus是以管理员的方式运行的,所以解决的办法有两种: 一.修改Editplus的兼容性,方法如下: 首先在Edit ...

  6. 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror

    先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...

  7. 转载:python文件打开方式详解——a、a+、r+、w+区别

    第一步 排除文件打开方式错误: r只读,r+读写,不创建      ###f.readline()是读取第一行,f.readlines()是读取全部并返回一个列表 w新建只写,w+新建读写,会将文件内 ...

  8. 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程

    原文网址:http://blog.csdn.net/ithomer/article/details/6322892 在登录Linux时要执行文件的过程如下:在刚登录Linux时,首先启动 /etc/p ...

  9. 文件I/O之/dev/fd

    较新的系统都提供名为/dev/fd的目录,其目录项是名为0.1.2等的文件.打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的). 在下列函数调用中: fd = open( " ...

随机推荐

  1. CentOS 7 下nagios搭建记录

    跟随 园子的文章搭建 http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html 1.遇 nagios插件地址迁移错误,记录解决. 2. ...

  2. 【贪心】Gym - 100507H - Pair: normal and paranormal

    每次取相邻的两个可以射击的从序列中删除,重复n次. 可以看作括号序列的匹配. #include<cstdio> #include<vector> using namespace ...

  3. 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值

    显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...

  4. 从cmd连接mysql数据库控制台

    在cmd中进入mysql安装目录的bin目录然后执行命令 mysql -uuser -ppassword database比如用户名为root,密码为mysql,数据库为test命令如下mysql - ...

  5. SQL Server DBA 文章:116篇 --DBA_Huangzj

    http://blog.csdn.net/DBA_Huangzj/article/category/1133081

  6. SSL和TSL的区别【转】

    SSL由从前的网景公司开发有1,2,3三个版本,但现在只使用版本3 TLS是SSL的标准化后的产物 有1.0 1.1 1.2三个版本 默认使用1.0 TLS1.0和SSL3.0几乎没有区别 事实上我们 ...

  7. Delphi 使窗体Showmodal后可以操作其他窗体

    对话框ShowModal之后不能操作其它窗口,实际上是因为Windows Disable了其它窗口.所以当你需要在模态对话框中访问其它已经可见的窗口时,需要用EnableWindow API来激活对应 ...

  8. SqlServer 执行计划及Sql查询优化初探

    网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时间差的例子来证明着什么(有点可笑),让许 ...

  9. Yii2 关于时间格式的用法

    先添加配置文件: 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai', 'components' => [ 'formatter ...

  10. [Android]一些设计细节

    1. 图标 图标分为:Launcher 图标(程序图标),ActionBar 图标(菜单图标),Contextual 图标(嵌入的小图标)以及Notification 图标(通知栏图标).每种图标都有 ...