linux一切皆文件之文件描述符(一)
一、知识准备
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一切皆文件之文件描述符(一)的更多相关文章
- Linux中断 - IRQ number和中断描述符
一.前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程.第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述 ...
- [转] linux系统文件流、文件描述符与进程间关系详解
http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括: ...
- linux一切皆文件之tcp socket描述符(三)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...
- linux一切皆文件之Unix domain socket描述符(二)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...
- linux一切皆文件之文件描述符
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件.如:普通文件.目录.字符设备.块设备.套接字等2.当一个文件被进程打开,就会创建一个文件描述符.这时候,文件的路径就成 ...
- linux专题一之文件描述符、重定向、管道符、tee命令
本节讨论一下几个问题: 1. 文件描述符. 2. 重定向. 3. 管道符 4. tee的用法. 1. 文件描述符. 在linux系统中一切皆文件.文件夹和设备都是文件.如何用来区别不同的文件呢?这里的 ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
- linux文件描述符--转载
转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...
- Linux中的文件描述符与打开文件之间的关系
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
随机推荐
- 理解JVM——JVM的结构
这是理解JVM的第一篇文章,这篇文章主要介绍JVM的总体结构和每一个部分的功能.内容比较少,对于每一个部分详细的内容,放到后面的文章中,逐步展开.这个系列总结完,应该会对JVM有一个整体且深入的认识了 ...
- springmvc IDEA
回顾Java平台上Web开发历程来看,从Servlet出现开始,到JSP繁盛一时,然后是Servlet+JSP时代,最后演化为现在Web开发框架盛行的时代.一般接触到一个新的Web框架,都会想问这个框 ...
- Cannot find module 'webpack/lib/node/NodeTemplatePlugin' 问题原因和解决方案
当我配置了html-webpack-plugin 打包时报了这个错,查看了一下package.json发现没有webpack,说明使用了全局安装的webapck,导致的版本差异. 这里在本地安装web ...
- 创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S
题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另 ...
- P2196 挖地雷
题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处 ...
- Java 遍历指定文件夹及子文件夹下的文件
Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @p ...
- fio是如何运行的?
本文主要介绍fio是如何运行的,并且以单线程.单job为例 fio的入口在fio.c中的main函数,下面列出了main函数,此处只出示了一些调用的关键函数 int main(int argc, ch ...
- iOS裁剪,缩放图片白边问题解决办法
几年没来了,感觉还是要写点啥,以后碰见问题 解决就写这吧,当是一个随时的笔记也好. iOS裁剪,缩放图片的代码网上也很多了,但是笔者出现了右边和下边出现白边的情况.出现白边的原因是给的size中的CG ...
- django之models学习总结
from django.db import models # Create your models here. class Classes(models.Model): ''' 班级表 ''' tit ...
- Linux中kafka部署和集群
1.下载kafka安装包kafka_2.12-1.1.0. tar -xzvf kafka_2.11-0.8.2.1.tgz #解压 mv kafka_2.11-0.8.2.1 /usr/local/ ...