Linux文件描述符
在Linux通用I/O模型中,I/O
操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开。这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗?
原文地址:https://learn-linux.readthedocs.io 。
玩转Linux旧群已满,请加新群:278378501 。
欢迎关注我们的公众号:小菜学编程 (coding-fan)
解答以上疑问,需要更深入学习——文件描述符(File Descriptor)。
图解
理解具体情况,需要了解由内核维护的3个数据结构:
- 进程级文件描述符表(file descriptor table)
- 系统级打开文件表(open file table)
- 文件系统i-node表(i-node table)
这3个数据结构之间的关系如下图所示:
文件描述符表
内核为每个进程维护一个文件描述符表,该表每一条目都记录了单个文件描述符的相关信息,包括:
- 控制标志(flags),目前内核仅定义了一个,即
close-on-exec
- 打开文件描述体指针
打开文件表
内核对所有打开的文件维护一个系统级别的打开文件描述表(open file description table),简称打开文件表。表中条目称为打开文件描述体(open file description),存储了与一个打开文件相关的全部信息,包括:
- 文件偏移量(file offset),调用
read()
和write()
更新,调用lseek()
直接修改 - 访问模式,由
open()
调用设置,例如:只读、只写或读写等 i-node
对象指针
i-node表
每个文件系统会为存储于其上的所有文件(包括目录)维护一个i-node
表,单个i-node
包含以下信息:
- 文件类型(file type),可以是常规文件、目录、套接字或
FIFO
- 访问权限
- 文件锁列表(file locks)
- 文件大小
- 等等
i-node
存储在磁盘设备上,内核在内存中维护了一个副本,这里的i-node
表为后者。副本除了原有信息,还包括:引用计数(从打开文件描述体)、所在设备号以及一些临时属性,例如文件锁。
场景解析
上图中,详细描述了两个进程诸多文件描述符,以及相互关系。
文件描述符复制
在进程A
中,文件描述符1和文件描述符20都指向同一个打开文件描述体(标号23)。这很可能是通过调用dup()
系列函数形成的。
文件描述符复制,在某些场景下非常有用,比如:标准输入/输出重定向。在shell
下,完成这个操作非常简单,大部分人都会,但是极少人思考过背后的原理。
大概描述一下需要的几个步骤,以标准输出(文件描述符为1)重定向为例:
- 打开目标文件,返回文件描述符n;
- 关闭文件描述符1;
- 调用
dup
将文件描述符n复制到1; - 关闭文件描述符n;
子进程继承文件描述符
进程A
的文件描述符2和进程B
的文件描述符2都指向同一个打开文件描述体(标号73)。这种情形很可能发生在调用fork()
派生子进程之后,比如A
调用fork()
派生出B
。这时,B
作为子进程,从父进程A
继承了文件描述符表,其中包括图中标明的文件描述符2。这就是子进程继承父进程打开的文件
这句话的由来。
当然了,进程A
通过Unix
套接字将一个文件描述符传递给B
也会出现类似的情形,但一般文件描述符数值是不一样的。同时为2要非常凑巧才发生。
下一步
更多文章请访问:学习Linux
订阅更新,获取更多学习资料,请关注我们的 微信公众号 :
Linux文件描述符的更多相关文章
- 玩转Linux文件描述符和重定向
本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...
- [转帖]linux文件描述符文件/etc/security/limits.conf
linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...
- linux文件描述符、软硬连接、输入输出重定向
引用链接:https://blog.csdn.net/qq769651718/article/details/79459346 文件描述符的作用: 文件描述符是linux操作系统中特有的概念.其相当于 ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- linux文件描述符--转载
转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...
- [性能分析]linux文件描述符(转)
1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...
- linux 文件描述符
文件描述符是什么?和文件句柄有啥区别?文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法.Linux系统中, 每当进程打开一个文件时,系统就为 ...
- [性能分析]linux文件描述符
1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
随机推荐
- Document对象关于窗口的一些属性
在网上搜罗的,只为自己查用方便,不做他用 window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间 ...
- express中间件笔记整理
expressexpress概念:express是基于nodejs的HTTPS模块构建出来的一个web应用开发框架,在nodejs之上扩展了 Web 应用所需的基本功能.本质上express应用就是调 ...
- 执行系统命令,subprocess使用说明
os.system('ls -l') #只执行命令,不能将结果赋予变量 os.system('mkdir test') #创建test目录 files = os.popen('ls -l').rea ...
- Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
前言:本文是我撰写的关于搭建“Nginx + PHP(FastCGI)”Web服务器的第6篇文章.本系列文章作为国内最早详细介绍 Nginx + PHP 安装.配置.使用的资料之一,为推动 Nginx ...
- Python实例---简单购物车Demo
简单购物车Demo # version: python3.2.5 # author: 'FTL1012' # time: 2017/12/7 09:16 product_list = ( ['Java ...
- 添加PHP扩展模块
php安装好后,可能在初次安装时,会有些模块会有遗漏,但是我们又不想重新编译php,因为耗时是比较长的.我们可不可以在不重新编译安装php的情况下,来为php单独添加某一个模块呢?查找资料,发现还是有 ...
- vSan中见证组件witness详解
witness在vSan中作为见证组件其作用类似于WinServer中的仲裁磁盘,当Cluster中某一节点发生故障时,来判断该节点上的对象在哪一个新的节点上继续承载.此处需要强调的是,witness ...
- Windows系统通用安全配置基线
一:共享账号检查 配置名称:账号分配检查,避免共享账号存在 配置要求: 1.系统需按照实际用户分配账号: 2.根据系统的使用需求,设定不同的账户和账户组,包括管理员用户,数据库用户,审计用户,来宾用户 ...
- JAVA把毫秒数转换成日期
JAVA把毫秒数转换成日期 systemMillonSenconds = System.currentTimeMillis(); 2012-08-17 14:42 1456人阅读 评论(1) 收藏 ...
- Linux基础入门 - 2
第三节 用户及文件权限管理 3-1.Linux用户管理 Linux 是一个可以实现多用户登陆的操作系统,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是 ...