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 ...
随机推荐
- css,js移动资源
随着移动市场的逐步扩大及相关技术的日趋完善,对前端开发提出了新的岗位要求,在继承前人成果的基础上需要在新的历史条件下有新的创新.移动端的开发,虽然没有IE6众多问题的折磨,但是多平台,多设备的兼容,也 ...
- 前端之body标签中相关标签(二)
一 列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: a.ul:unordered list,“无序列表”的意思. b.li ...
- 鼠标事件-拖拽2(不能拖出指定对象的div)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...
- Qt消息机制和事件、事件过滤
一,事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等 ...
- APACHE如何一个站点绑定多个域名?
大家肯定遇到过这样的情况,需要APACHE2里一个站点绑定多个域名,那么如何操作呢?用ServerAlias 以前很笨,要使多个域名指向同一站点总是这样写: ServerAdmin admin@dom ...
- axure rp8.1 注册码
授权人:University of Science and Technology of China (CLASSROOM)授权密钥:DTXRAnPn1P65Rt0xB4eTQ+4bF5IUF0gu0X ...
- asp.net生成PDF文件(一)
这个是例子是网上淘来的,哈哈,很有用的! 首先要到网上下载itextsharp.dll,然后添加引用,主程序如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...
- NAT原理简介、各种 ADSL Modem 及路由器的端口映射方法
NAT原理简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force ...
- 【Leetcode】【Medium】Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...