Unix内核中打开文件的表示

Unix内核中已经打开文件,通过三种数据结构表示:

  1. 每个进程的进程表中的记录项,包含打开的文件的文件描述符表,与之关联的是:

    • 文件描述符标识
    • 指向一个文件表项的指针
  2. 内核为所有打开文件维持一张文件表,每个文件表项代表一个打开文件,包含:
    • 文件状态标识(读、写、添加、同步、非阻塞等
    • 当前文件偏移量
    • 指向该文件v节点表项的指针

3. 每个打开文件都有且只有一个V节点(v-node)结构

    • 文件类型
    • 对此文件进行各种操作的函数的指针
    • (大多数文件)该文件的i节点(i-node,索引节点)

  一个打开的文件的结构如下图所示:

这些信息都是打开文件时从磁盘读入内存的

为什么要有V节点结构呢?对在一个计算机系统上的多文件系统类型提供支持。也称之为虚拟文件系统(所以v-node中的v指的是virtual?)linux没有将相关数据结构分为i-node和v-node,而是采用了一个独立于文件系统的i节点和一个依赖于文件系统的i节点

每个进程都只有自己的进程表项,故而每个进程都有自己的文件表项,但是文件可以被多个进程各自打开而每个打开文件都有且只有一个V节点表,于是会有多个文件表项指向同一个V节点表的情况。

而为什么每个进程都有自己的文件表项而不是每个打开文件都只有一个文件表项呢?首先要知道文件表中的当前文件偏移量指的是每次write之后表示增加缩写的字节数,所以每个进程对应一个文件表保证了每个进程都有自己对该文件的当前偏移量。

时间: 2024-09-30 21:11:15

Unix内核中打开文件的表示的相关文章

在linux内核中读写文件

http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装). 但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读Linux内核源码,可以知道陷入内核执行的是实际执行的是sys_read和sys_write这两个函数,但是这两个函数没有使用EXPORT_SYMBOL导出,也就是说其他模块不能使用. 在fs/open.c

【转】在linux内核中读写文件 -- 不错

原文网址:http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装). 但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读linux内核源码,可以知道陷入内核执行的是实际执行的是sys_read和sys_write这两个函数,但是这两个函数没有使用EXPORT_SYMBOL导出,也就是说其他模块不能使用. 在fs/o

【翻译自mos文章】在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)

在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log) 参考原文: Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1) 适用于: Oracle Database - Enterprise Edition - Version 8.1.7.0 to 11.2.0.3 [Release 8.1.7 to 11.2] Linu

mint/ubuntu 在终端 / Shell中 打开文件夹

我知道的有两种方法, 都是命令后面加路径(nautilus|pcmanfm dir_path) 方法一: 使用 nautilus 安装:sudo apt-get intstall nautilus 效果:nautilus ~ 方法二: 使用 pcmanfm 安装:sudo apt-get intstall pcmanfm 效果:pcmanfm ~ 不过这两种方法都让我有点不爽,因为和原生系统的不一样,还有一点慢, 现在还可以忍,如果你有更好的方法请留言.(原生系统如下) mint/ubuntu

解决sublime text 2总是在新窗口中打开文件

在mac下不是很喜欢sublime text 2 总是在新窗口中打开文件,很麻烦,文件打多了,就会出现N多窗口,虽然可以直接打开当前目录可以解决,但有时候查看其它项目中的单个文件,就比较麻烦.百度一直在搜索,无果. 今天去官方论坛看了一下,发现了一个设置: ”open_files_in_new_window”: true,将其设置成false就OK了,会在当前窗口中打开文件 具体设置:Preferences -> Settings – Users  ->  搜索open_files_in_ne

在eclipse中打开文件所在的目录

eclipse中默认是不能直接打开文件所在的目录的,需要在文件中右键-->properties-->location,复制到资源管理器中才能打开文件所在的目录.这种方法很麻烦.这里介绍一种在eclipse中直接打开文件所在目录的方法. 工具/原料 eclipse 方法/步骤 展开如下菜单: Run ---- External Tools ---- External Tools Configurations   在 program 下面新建一个工具   在 Location 中填写 window

如何解决sublime text 2总是在新窗口中打开文件及文件夹

如何在原窗口打开文件 具体设置:Preferences -> Settings – Default -> 搜索open_files_in_new_window,将其true 改为 false 后,重启一下sublime text 2 就OK.但是博主不建议这么做,最好在Preferences -> Settings – User下新增一条”open_files_in_new_window”: false 就OK了 如何在原窗口打开文件夹 这里需要这样操作,点击Project-Add Fo

python中打开文件区别

r只读,r+读写,两个都不创建########################################w新建只写,w+新建读写,二者都会将文件内容清零(以w方式打开,不能读出.w+可读写)############################################以a,a+的方式打开文件,附加方式打开(a:附加写方式打开,不可读:a+: 附加读写方式打开)##############################################w+与r+区别:r+:可读可写

去除VIM中打开文件里有的^M字符

现象:在linux下打开Windows编辑的文本文件时会出现^M 原因:把文件从一个系统移到另一个不同的系统,你就会遇到与换行相关的问题. 解决方法: 在命令模式下使用正则表达式进行字符全文空替换:其中"^M"的输入,分别是"Ctrl+v"."Ctrl+M"键生成的.像^M 这样的在VIM中是控制字符,在查找替换中输入控制字符必须用别的方法,那就是在输入^M时,必须依次在键盘上敲入Ctrl+V和Ctrl+M. :%s/^M//g 使用sed 工具