文件打开的过程——调用fd=open()时操作系统所做的工作
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()时操作系统所做的工作的更多相关文章
- 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器
		
[源码下载] 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件打开选取器 示例1.演示如何 ...
 - linux下系统启动时,几个配置文件 /etc/profile、~/.bash_profile 等几个文件的执行过程,先后顺序
		
1. 在登录Linux时要执行文件的过程如下: 在刚登录Linux时, 首先启动 /etc/profile 文件, 然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login ...
 - C#编译器优化那点事    c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错    webAPI 控制器(Controller)太多怎么办?    .NET MVC项目设置包含Areas中的页面为默认启动页  (五)Net Core使用静态文件    学习ASP.NET Core Razor 编程系列八——并发处理
		
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
 - excel双击文件打开时空白,使用菜单打开正常的解决办法
		
excel双击文件打开时空白,使用菜单打开正常的解决办法 打开 excel的选项 找到高级->常规 取消“忽略使用动态数据交换...”的勾,确定. 问题解决.
 - 关于各种文件用Editplus的方式打开出现“向程序发送命令时出现问题”的解决方法
		
其实网上有很多解决方法,但是我试过都没有用. 我出现这个错误的原因是因为我的Editplus是以管理员的方式运行的,所以解决的办法有两种: 一.修改Editplus的兼容性,方法如下: 首先在Edit ...
 - 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror
		
先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...
 - 转载:python文件打开方式详解——a、a+、r+、w+区别
		
第一步 排除文件打开方式错误: r只读,r+读写,不创建 ###f.readline()是读取第一行,f.readlines()是读取全部并返回一个列表 w新建只写,w+新建读写,会将文件内 ...
 - 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程
		
原文网址:http://blog.csdn.net/ithomer/article/details/6322892 在登录Linux时要执行文件的过程如下:在刚登录Linux时,首先启动 /etc/p ...
 - 文件I/O之/dev/fd
		
较新的系统都提供名为/dev/fd的目录,其目录项是名为0.1.2等的文件.打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的). 在下列函数调用中: fd = open( " ...
 
随机推荐
- CentOS 7 下nagios搭建记录
			
跟随 园子的文章搭建 http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html 1.遇 nagios插件地址迁移错误,记录解决. 2. ...
 - 【贪心】Gym - 100507H - Pair: normal and paranormal
			
每次取相邻的两个可以射击的从序列中删除,重复n次. 可以看作括号序列的匹配. #include<cstdio> #include<vector> using namespace ...
 - 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值
			
显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...
 - 从cmd连接mysql数据库控制台
			
在cmd中进入mysql安装目录的bin目录然后执行命令 mysql -uuser -ppassword database比如用户名为root,密码为mysql,数据库为test命令如下mysql - ...
 - SQL Server DBA 文章:116篇 --DBA_Huangzj
			
http://blog.csdn.net/DBA_Huangzj/article/category/1133081
 - SSL和TSL的区别【转】
			
SSL由从前的网景公司开发有1,2,3三个版本,但现在只使用版本3 TLS是SSL的标准化后的产物 有1.0 1.1 1.2三个版本 默认使用1.0 TLS1.0和SSL3.0几乎没有区别 事实上我们 ...
 - Delphi  使窗体Showmodal后可以操作其他窗体
			
对话框ShowModal之后不能操作其它窗口,实际上是因为Windows Disable了其它窗口.所以当你需要在模态对话框中访问其它已经可见的窗口时,需要用EnableWindow API来激活对应 ...
 - SqlServer 执行计划及Sql查询优化初探
			
网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时间差的例子来证明着什么(有点可笑),让许 ...
 - Yii2 关于时间格式的用法
			
先添加配置文件: 'language' => 'zh-CN', 'timeZone' => 'Asia/Shanghai', 'components' => [ 'formatter ...
 - [Android]一些设计细节
			
1. 图标 图标分为:Launcher 图标(程序图标),ActionBar 图标(菜单图标),Contextual 图标(嵌入的小图标)以及Notification 图标(通知栏图标).每种图标都有 ...