文章目录
- 1.文件描述符
- 2.文件描述符在内核中存在的方式
- 3.测试
- 4.总结
1.文件描述符
- 在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等
- 当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了字节流的接口
- 相对于普通文件这类真实存在于文件系统中的文件,tcp socket、unix domain socket等这些存在于内存中的特殊文件在被进程打开的时候,也会创建文件描述符。
所以"一切皆文件"更准确的描述应该是"一切皆文件描述符"
2.文件描述符在内核中存在的方式
- 文件描述符是一个抽象索引,它指向普通的文件或者I/O设备
- 文件描述符是一个非负整数,它是连接用户空间和内核空间纽带
3.测试
- 打开一个python的交互控制台,然后以只读的方式打开了一个文件,并且打印了该文件描述符为4
[root@localhost disktool]# python
Python 2.6.6 (r266:84292, Apr 26 2012, 06:50:33)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> fd=os.open('test.log',os.O_RDONLY)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'test.log'
>>> fd=os.open('/home/wangji/test.log',os.O_RDONLY)
>>> print fd
4
>>>
- 由于运行了一个python命令行,pid为10900,为了支撑它的运行,需要获取一些依赖,包括普通文件、目录、字符设备等
[root@localhost wangji]# ps -ef |grep python
root 1071 25768 0 11:39 pts/1 00:00:00 python
root 6772 5934 0 14:27 pts/0 00:00:00 grep --color=auto python
root 23997 1 0 Nov21 ? 00:04:45 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
[root@localhost wangji]# lsof -n |grep 1071
python 1071 root cwd DIR 253,0 4096 2506055 /var/log/dfs/disktool
python 1071 root rtd DIR 253,0 4096 2 /
python 1071 root txt REG 253,0 9272 938579 /usr/bin/python
python 1071 root mem REG 253,0 161657 2368823 /lib64/ld-2.14.1.so
python 1071 root mem REG 253,0 1876973 2368824 /lib64/libc-2.14.1.so
python 1071 root mem REG 253,0 395115 2368835 /lib64/libm-2.14.1.so
python 1071 root mem REG 253,0 22045 2368588 /lib64/libdl-2.14.1.so
python 1071 root mem REG 253,0 139411 2368737 /lib64/libpthread-2.14.1.so
python 1071 root mem REG 253,0 90952 2368836 /lib64/libz.so.1.2.3
python 1071 root mem REG 253,0 271976 2359615 /lib64/libreadline.so.6.0
python 1071 root mem REG 253,0 124624 2368832 /lib64/libselinux.so.1
python 1071 root mem REG 253,0 101080 2368831 /lib64/libresolv-2.14.1.so
python 1071 root mem REG 253,0 1661232 954746 /usr/lib64/libcrypto.so.1.0.0
python 1071 root mem REG 253,0 1751328 949885 /usr/lib64/libpython2.6.so.1.0
python 1071 root mem REG 253,0 46336 2368844 /lib64/libkrb5support.so.0.1
python 1071 root mem REG 253,0 12592 2368843 /lib64/libkeyutils.so.1.3
python 1071 root mem REG 253,0 181632 2368845 /lib64/libk5crypto.so.3.1
python 1071 root mem REG 253,0 915736 2368847 /lib64/libkrb5.so.3.3
python 1071 root mem REG 253,0 272360 2368848 /lib64/libgssapi_krb5.so.2.2
python 1071 root mem REG 253,0 17204 2368834 /lib64/libutil-2.14.1.so
python 1071 root mem REG 253,0 375336 954747 /usr/lib64/libssl.so.1.0.0
python 1071 root mem REG 253,0 134568 2368857 /lib64/libtinfo.so.5.7
python 1071 root mem REG 253,0 7744 1446229 /usr/lib64/python2.6/lib-dynload/syslog.so
python 1071 root mem REG 253,0 24008 1446224 /usr/lib64/python2.6/lib-dynload/readline.so
python 1071 root mem REG 253,0 99158704 919173 /usr/lib/locale/locale-archive
python 1071 root mem REG 253,0 20112 1446205 /usr/lib64/python2.6/lib-dynload/cStringIO.so
python 1071 root mem REG 253,0 17256 2368846 /lib64/libcom_err.so.2.1
python 1071 root mem REG 253,0 33216 1446197 /usr/lib64/python2.6/lib-dynload/_ssl.so
python 1071 root mem REG 253,0 62192 1446195 /usr/lib64/python2.6/lib-dynload/_socketmodule.so
python 1071 root mem REG 253,0 26050 954714 /usr/lib64/gconv/gconv-modules.cache
python 1071 root 0u CHR 136,1 0t0 4 /dev/pts/1
python 1071 root 1u CHR 136,1 0t0 4 /dev/pts/1
python 1071 root 2u CHR 136,1 0t0 4 /dev/pts/1
python 1071 root 3u unix 0xffff8803efadc380 0t0 103964339 socket
python 1071 root 4r REG 253,2 0 5776692 /home/wangji/test.log
显示的结果与下面相对应:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
其中FD的类型有:
cwd: 当前目录
rtd: 根目录
txt: 应用程序
mem: 内存映射文件
数字(0,1,2,3): 打开的文件描述符
u.r.w: 文件的权限: 读写、只读、只写
其中TYPE类型有:
DIR: 目录
REG: 普通文件
CHR: 字符设备
- 进程打开文件之后,会创建文件描述符:
[root@localhost wangji]# ll /proc/1071/fd
total 0
lrwx------. 1 root root 64 Nov 23 14:29 0 -> /dev/pts/1
lrwx------. 1 root root 64 Nov 23 14:29 1 -> /dev/pts/1
lrwx------. 1 root root 64 Nov 23 11:39 2 -> /dev/pts/1
lrwx------. 1 root root 64 Nov 23 14:29 3 -> socket:[103964339]
lr-x------. 1 root root 64 Nov 23 14:29 4 -> /home/wangji/test.log 和 print fd 返回的3相一致
4.总结
- 本文演示了进程运行过程中需要的资源都以文件描述符的方式呈现,不管这类资源是普通文件、目录还是字符设备
- 将所有依赖的资源用文件描述符表述,使用统一的API、工具集等,方便操作系统对资源的管理
参考:
linux一切皆文件之文件描述符(一)