一、知识准备

1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等

2、当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了字节流的接口

3、相对于普通文件这类真实存在于文件系统中的文件,tcp socket、unix domain socket等这些存在于内存中的特殊文件在被进程打开的时候,也会创建文件描述符。所以"一切皆文件"更准确的描述应该是"一切皆文件描述符"

二、环境准备

组件 版本
OS CentOS Linux release 7.5.1804

三、文件描述符

● 文件描述符是一个抽象索引,它指向普通的文件或者I/O设备

● 文件描述符是一个非负整数,它是连接用户空间和内核空间纽带

四、测试

我们来看下进程打开的文件描述符:

[root@localhost tmp]# python
Python 2.7.5 (default, Apr 11 2018, 07:36:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> fd = os.open('test.log' , os.O_RDONLY)
>>> print fd
3
>>>
[1]+ Stopped python

打开一个python的交互控制台,然后以只读的方式打开了一个文件,并且打印了该文件描述符3

我们将交互界面丢如后台以便于观察:

[root@localhost tmp]# ps | grep python
10900 pts/1 00:00:00 python
[root@localhost tmp]# lsof -n | grep 10900
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 10900 root cwd DIR 253,0 4096 16777288 /tmp
python 10900 root rtd DIR 253,0 251 64 /
python 10900 root txt REG 253,0 7216 50394900 /usr/bin/python2.7
python 10900 root mem REG 253,0 174576 73603 /usr/lib64/libtinfo.so.5.9
python 10900 root mem REG 253,0 285240 79288 /usr/lib64/libreadline.so.6.2
python 10900 root mem REG 253,0 28440 50390214 /usr/lib64/python2.7/lib-dynload/readline.so
python 10900 root mem REG 253,0 106070960 50566346 /usr/lib/locale/locale-archive
python 10900 root mem REG 253,0 2173512 54770 /usr/lib64/libc-2.17.so
python 10900 root mem REG 253,0 1139680 54778 /usr/lib64/libm-2.17.so
python 10900 root mem REG 253,0 14872 54804 /usr/lib64/libutil-2.17.so
python 10900 root mem REG 253,0 19776 54776 /usr/lib64/libdl-2.17.so
python 10900 root mem REG 253,0 144792 54796 /usr/lib64/libpthread-2.17.so
python 10900 root mem REG 253,0 1847504 137746 /usr/lib64/libpython2.7.so.1.0
python 10900 root mem REG 253,0 164240 54763 /usr/lib64/ld-2.17.so
python 10900 root mem REG 253,0 26254 16796368 /usr/lib64/gconv/gconv-modules.cache
python 10900 root 0u CHR 136,1 0t0 4 /dev/pts/1
python 10900 root 1u CHR 136,1 0t0 4 /dev/pts/1
python 10900 root 2u CHR 136,1 0t0 4 /dev/pts/1
python 10900 root 3r REG 253,0 0 17560386 /tmp/test.log

由于运行了一个python命令行,pid为10900,为了支撑它的运行,需要获取一些依赖,包括普通文件、目录、字符设备等

其中打开了大量的文件描述符,我们来选几个需要关注的内容:

FD:

    cwd: 当前目录

    rtd: 根目录

    txt: 应用程序

    mem: 内存映射文件

    数字(0,1,2,3): 打开的文件描述符

    u.r.w: 文件的权限: 只读、只写、读写

TYPE:

    DIR: 目录

    REG: 普通文件

    CHR: 字符设备

进程打开文件之后,会创建文件描述符:

[root@localhost tmp]# ls -l /proc/10900/fd
total 0
lrwx------ 1 root root 64 Nov 13 22:10 0 -> /dev/pts/1
lrwx------ 1 root root 64 Nov 13 22:10 1 -> /dev/pts/1
lrwx------ 1 root root 64 Nov 13 22:10 2 -> /dev/pts/1
lr-x------ 1 root root 64 Nov 13 22:10 3 -> /tmp/test.log

3 -> /tmp/test.log也和 print fd 返回的3相一致

五、小结

● 本文演示了进程运行过程中需要的资源都以文件描述符的方式呈现,不管这类资源是普通文件、目录还是字符设备

● 将所有依赖的资源用文件描述符表述,使用统一的API、工具集等,方便操作系统对资源的管理

六、参考资料

https://en.wikipedia.org/wiki/Everything_is_a_file

https://stackoverflow.com/questions/25140730/what-does-the-fd-column-of-pipes-listed-by-lsof-mean

https://en.wikipedia.org/wiki/File_descriptor


至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

linux一切皆文件之文件描述符(一)的更多相关文章

  1. Linux中断 - IRQ number和中断描述符

    一.前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程.第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述 ...

  2. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  3. linux一切皆文件之tcp socket描述符(三)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...

  4. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  5. linux一切皆文件之文件描述符

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件.如:普通文件.目录.字符设备.块设备.套接字等2.当一个文件被进程打开,就会创建一个文件描述符.这时候,文件的路径就成 ...

  6. linux专题一之文件描述符、重定向、管道符、tee命令

    本节讨论一下几个问题: 1. 文件描述符. 2. 重定向. 3. 管道符 4. tee的用法. 1. 文件描述符. 在linux系统中一切皆文件.文件夹和设备都是文件.如何用来区别不同的文件呢?这里的 ...

  7. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

  8. linux文件描述符--转载

    转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...

  9. Linux中的文件描述符与打开文件之间的关系

    Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...

随机推荐

  1. Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;能够将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/24256091 Session操作过程中的po ...

  2. Mybatis 的常见面试题

    背景:好久没用Mybatis了,有些面试题还是要好好准备的. Mybatis 的常见面试题

  3. Spring源码分析(二)容器基本用法

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 在正式分析Spring源码之前,我们有必要先来回顾一下Spring中最简 ...

  4. 命令行编译执行java

    命令行编译运行java程序 使用命令 javac进行编译 和 java进行执行. javac 后面跟着的是java文件的文件名,例如 HelloWorld.java. 该命令用于将 java 源文件编 ...

  5. JSONP - 从理论到实践

    同源策略 ajax之所以需要“跨域”,罪魁祸首就是浏览器的同源策略.即,一个页面的ajax只能获取这个页面相同源或者相同域的数据. 如何叫“同源”或者“同域”呢?——协议.域名.端口号都必须相同.例如 ...

  6. CSU 2056 a simple game (正反进行KMP)超级好题!!!

    Description 这一天,小A和小B在玩一个游戏,他俩每人都有一个整数,然后两人轮流对他们的整数进行操作,每次在下列两个操作任选一个: (1)对整数进行翻转,如1234翻转成4321 ,1200 ...

  7. HDU1047(多个大数相加)

    Integer Inquiry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. CCF认证201712-2游戏

    问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋 ...

  9. MySQL 性能测试

    MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行.最终目标是提交 SELECT 语句查找数据行,而不是排除数据行.优化器试图排除数据 ...

  10. 大数据入门第十天——hadoop高可用HA

    一.HA概述 1.引言 正式引入HA机制是从hadoop2.0开始,之前的版本中没有HA机制 2.运行机制 实现高可用最关键的是消除单点故障 hadoop-ha严格来说应该分成各个组件的HA机制——H ...