Unix系统编程()文件描述符和打开文件之间的关系
目前学习到的是一个文件描述符对应着一个打开的文件,似乎是对应的关系。但是实际上并不是这样的。多个文件描述符指向同一个打开的文件,是可能的也是必要的。这些文件描述符可以在相同或者不同的进程中打开。
要理解具体情况,需要查看内核维护的3个数据结构。
进程级的文件描述符表
系统级的打开文件表
文件系统的i-node表
针对每个进程,内核为其维护打开文件的描述符(open file descriptor)表。该表的每一条目都记录了单个文件描述符的相关信息。包括有一下信息:
控制文件描述符操作的一组标志。(目前,此类标志仅定义了一个,即close-on-exec标志)
打开文件句柄的引用
内核对所有打开的文件维护有一个系统级的描述符表格(open file description table)。有时也称之为打开文件表(open file table),并将表中各条目称之为打开文件句柄(open file handle)。一个打开文件句柄存储了一个与打开文件相关的全部信息,如下所示。
当前文件偏移量(调用read和write时更新,或者使用lseek直接修改)。
打开文件时所使用的的状态标志(即open的flags参数)
文件的访问模式(如调用open时所设置的只读模式,只写模式或读写模式)
与信息驱动IO相关的设置
对该文件i-node对象的引用。
每个文件系统都会为驻留其上的所有文件建立一个i-node表。以后将详细讨论i-node结构和文件系统的总体结构。每个文件的i-node信息,有以下:
文件类型(例如,常规文件、套接字或FIFO)和访问权限。
一个指针,指向该文件所持有的锁的列表。
文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳。
此处将忽略i-node在磁盘和内存中的表示差异。磁盘上的i-node记录了文件的固有属性,诸如:文件类型、访问权限和时间戳。访问一个文件时,会在内存中为i-node创建一个副本,其中记录了引用该i-node的打开文件句柄数量以及i-node所在设备的主、从设备号,还包括一些打开文件时与文件相关的临时属性,例如:文件锁。
下图展示了文件描述符、打开的文件句柄以及i-node之间的关系。在下图中,两个进程拥有诸多打开的文件描述符。

在进程A中,文件描述符1和20都指向同一个打开的文件句柄(标号为23号)。这可能是通过调用dup、dup2或fcntl而形成的。
进程A的文件描述符2和进程B的文件描述符2都指向同一个打开的文件句柄(标号为73号)。这种情形可能在fork调用之后出现(即进程A和进程B是父子关系),或者当某进程通过UNIX套接字将一个打开的文件描述符传给另一个进程。
此外进程A的描述符0和进程B的描述符3分别指向不同的打开文件的句柄,但这些句柄均指向i-node表中的相同条目(1976),换言之,指向同一个文件。发生这种情况是因为每个进程各自对同一文件发起了open调用。同一个进程两次打开同一文件,也会发生这种情况。
结论:
两个不同的文件描述符,若指向同一个打开文件的句柄,将共享同一文件偏移量。因此,如果通过其中一个文件描述符来修改文件偏移量(由调用read、write或者lseek所致),那么从另一文件描述符中也会观察到这一变化。无论这两个文件描述符分别属于不同进程还是属于同一个进程,情况都是如此。
要获取和修改打开的文件标志(例如O_APPEND、O_NONBLOCK和O_ASYNC),可以执行fcntl的F_GETFL和F_SETFL操作,其对作用于的约束与上一条颇为类似。
相比之下,文件描述符标志(close-on-exec)为进程和描述符所私有。这一标志的修改不会影响同一个进程或不同进程中的其他文件描述符。
Unix系统编程()文件描述符和打开文件之间的关系的更多相关文章
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
- (转)Linux中的文件描述符与打开文件之间的关系
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- Linux中文件描述符fd和文件指针flip的理解
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- [转载] linux中文件描述符fd和文件指针flip的理解
转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- 文件描述符fd、文件指针fp和vfork()
1. fd:在形式上是一个非负整数.实际上他是一个索引值.指向kernal为每一个进程所维护的该进程打开文件的记录表. 当程序打开一个文件或者创建一个新文件的时候kernal向进程返回一个文件描述符. ...
- python 将文件描述符包装成文件对象
有一个对应于操作系统上一个已打开的I/O 通道(比如文件.管道.套接字等)的整型文件描述符,你想将它包装成一个更高层的Python 文件对象. 一个文件描述符和一个打开的普通文件是不一样的.文件描述符 ...
随机推荐
- 【云计算】Docker 镜像如何设置语言环境?bash: warning: setlocale: LC_ALL: cannot change locale (en_US)
解决方案: # set default language environment RUN locale-gen en_US.UTF- \ && dpkg-reconfigure loc ...
- .NET-MVC站点发布注意事项
在进行MVC站点发布的过程中需要注意bin文件,使用vs2013自带的发布功能容易漏掉一些dll文件,所以在发布之后需要将程序的bin目录下的文件拷贝到发布好的iis站点下面
- Sql从一张表中更改另一张表数据
语法: update table1 set table1.列=table2.列 from table2 where table2.列=table1.列update dbo.PATIENT se ...
- FrameWork中SQLServer数据源使用宏函数出错解决办法
环境:DW是SQLServer2008 建模工具:Cognos FrameWork Version:Cognos10.2 出现问题:在FM中创建查询主题,sql类型数据源,引入宏函数#CAMIDLis ...
- 【Hadoop基础】hadoop fs 命令
1,hadoop fs –fs [local | <file system URI>]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop ...
- ambari 大数据安装利器
https://www.ibm.com/developerworks/cn/opensource/os-cn-bigdata-ambari/
- 教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)
教大家如何在word 2007中打出(非编辑器): 如果要在多个字符串上面加上划线,可以使用一下步骤 按下“Ctrl+F9”组合键,出现“{}”,在{}中输入“EQ \x\to(要加上划线的字符串)” ...
- git config 的全局配置
使用git的全局配置 .gitconfig 一:修改 用户下的.gitconfig 修改如图信息,添加你的信息 二: 命令添加 $ git config --global user.name ...
- Redis源代码剖析和凝视(八)--- 对象系统(redisObject)
Redis 对象系统 1. 介绍 redis中基于双端链表.简单动态字符串(sds).字典.跳跃表.整数集合.压缩列表.高速列表等等数据结构实现了一个对象系统,而且实现了5种不同的对象,每种对象都使用 ...
- Java之字节码(1) - 深入解析
转载地址 一:Java字节代码的组织形式 类文件{ OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域 ...