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

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

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

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

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

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

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

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

第一种情况:

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

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

另外一种情况:

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

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

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

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

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

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

时间: 2024-10-13 23:29:29

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

利用文件打开方式with open('文件名',方式) as 变量名做一个简单的复制(排除大文件bug)

1 #!usr/bin/env python 2 #-*- coding=utf-8 -*- 3 4 with open('b.py','r') as obj1, open('c.py','w') as obj2: 5 for line in obj1.read(): 6 obj2.write(line) 将a.py的数据一行一行的进行复制 节省的了内存 另外 这种打开方式 免除了 之后需要的f.close() 对代码量上有细微的差距...(我自己想的...) 注意:第二个open不接with

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

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件打开选取器 示例1.演示如何开发自定义文件打开选取器App.xaml.cs // 通过文件打开选取器激活应用程序时所调用的方法 protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args) { var rootFrame = new Frame(); rootFrame.Navigate(

iOS开发-方法调用在运行时的过程

方法调用在运行时的过程 如果用实例对象调用实例方法,会到实例的isa指针指向的对象(也就是类对象)操作. 如果调用的是类方法,就会到类对象的isa指针指向的对象(也就是元类对象)中操作. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 如果没找到,去父类指针所指向的对象中执行1,2. 以此类推,如果一直到根类还没找到,转向拦截调用. 如果没有重写拦截调用的方法,程序报错. 以

【BO】WEBI文件打开时提示Illegal access错误

在infoview中打开WEBI文件时,提示如下错误. 通过查看SCN,找到错误原因是CMC中有一个服务没有启动. 启动这个服务即可: WebIntelligenceProcessingServer [BO]WEBI文件打开时提示Illegal access错误,布布扣,bubuko.com

Biee11g导出excel文件打开时出现乱码

问题描述:在rpd中导出含有中文的CSV格式的文件后 用OFFICE2007打开时出现中文乱码情况 备注:导出csv文件时 选择编码为UTF-8则会出现乱码 选择UNICODE编码则正常显示 选择ANSI编码时 则导出文件不全-------只有""""符号 , 没有其他内容 故障原因 此种情况一般是导出的文件编码的问题.在简体中文环境下,EXCEL打开的CSV文件默认是ANSI编码,如果CSV文件的编码方式为utf-8.Unicode等编码可能就会出现文件乱码的情况

XenApp6发布Office2010文件打开时显示为空白文件的问题

XenApp6.5 发布Office2010文件打开通过UNC路径的Word文件时显示为空白文件的问题,以下KB是解决此问题方法: http://support.citrix.com/article/CTX128151

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

其实网上有很多解决方法,但是我试过都没有用. 我出现这个错误的原因是因为我的Editplus是以管理员的方式运行的,所以解决的办法有两种: 一.修改Editplus的兼容性,方法如下: 首先在Editplus快捷方式上右击,然后点击属性 之后选择兼容性 然后把这一项的勾去掉,然后确定即可. 二.不修改Editplus的兼容性,方法如下: 首先打开Editplus快捷方式,这个时候打开的方式任然还是以管理员的方式运行,然后我们再打开文件-打开,然后就自己搜索要打开的文件, 这样子就成功了,不会出现

Python3 open() 函数-用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

完整的语法格式为: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 参数说明: file: 必需,文件路径(相对或者绝对路径). mode: 可选,文件打开模式 buffering: 设置缓冲 encoding: 一般使用utf8 errors: 报错级别 newline: 区分换行符 closefd: 传入的file参数类型 opene

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

第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,会将文件内容清零 (以w方式打开,不能读出.w+可读写) **w+与r+区别: r+:可读可写,若文件不存在,报错:w+: 可读可写,若文件不存在,创建 r+与a+区别: [python] view plain copy print? <span style="background-color: rgb(255, 255, 255);">fd = open("1.txt"