美文网首页蓉城devops程序员
linux一切皆文件之文件描述符(一)

linux一切皆文件之文件描述符(一)

作者: wilsonchai | 来源:发表于2019-02-28 09:28 被阅读7次

一、知识准备

1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等
2、当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了字节流的接口
3、相对于普通文件这类真实存在于文件系统中的文件,tcp socket、unix domain socket等这些存在于内存中的特殊文件在被进程打开的时候,也会创建文件描述符。所以"一切皆文件"更准确的描述应该是"一切皆文件描述符"

二、环境准备

组件 版本
OS CentOS Linux release 7.5.1804

三、文件描述符

● 文件描述符是一个抽象索引,它指向普通的文件或者I/O设备
● 文件描述符是一个非负整数,它是连接用户空间和内核空间纽带

image

四、测试

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

[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


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

相关文章

  • Shell语法(5)--重定向

    重定向 在Linux中,所有输出的目标都是文件,一切皆文件,所以输出的目的地也是一个文件描述符 文件描述符 描述符...

  • 10分钟了解Linux虚拟文件系统和文件描述符

    Linux虚拟文件系统和文件描述符.md Linux设计哲学之一切皆文件.Linux通过VFS, 虚拟文件系统管理...

  • 文件描述符

    文件描述符简介 在linux系统中,一切皆文件,当进程打开现有文件或者创建新文件时,内核向进程返回一个文件描述符,...

  • Linux的I/O重定向和管道

    在Linux系统中一切皆文件,当打开一个文件时,Linux会自动分配一个称为文件描述符(file descript...

  • linux一切皆文件之文件描述符(一)

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

  • Linux IO模型

    Linux下一切皆文件,连外部设备都当作文件;对文件的读写操作会调用内核系统命令,返回文件描述符,简称fd;而对s...

  • 第一章 文件I/O

    Linux中的文件 文件、文件描述符和文件表 Linux内核将一切视为文件,狭义上是指文件系统系统中的物理文件,广...

  • Linux文件系统

    概念 在Linux中几乎一切都可以看作文件。that's all. 文件描述符 所有被打开的文件都由文件描述符来引...

  • Linux学习笔记(一)---Linux文件和目录

    一. Linux文件和目录 一切皆文件 Linux 中所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件...

  • 15- Shell脚本基础(三)重定向

    在了解重定向之前,我们先来看看linux 的文件描述符。 linux文件描述符:可以理解为linux跟踪打开文件,...

网友评论

    本文标题:linux一切皆文件之文件描述符(一)

    本文链接:https://www.haomeiwen.com/subject/puwcuqtx.html