一、简介
1、概述
我们知道在Linux系统中的一切都可以被视为文件,文件可以分为:普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件时,我们每次都会找到一个名字,这需要很多时间和效率。Linux规定每个文件对应一个索引,以便在操作文件时,我们可以直接找到索引进行操作。
文件描述符(file descriptor)为了有效地管理这些已经打开的文件创建的索引,它是一个非负整数(通常是小整数),用于指代打开的文件,所有执行I/O操作系统的呼叫是通过文件描述符实现的。同时,还规定,当系统刚刚启动时,0是标准输入,1是标准输出,2是标准错误。
2、图示解释
FD是访问文件的标识,即链接文件:
0是键盘只读。
1、2是终端,可以理解是屏幕。
3+是文件,可读可写。
二、查看进程的FD信息
通过熟悉的vim的进程来观察进程的FD信息
1、通过vim查看进程FD信息
1)通过一个终端,打开一个文本
命令:vim 文件名
[root@localhost ~]# vim /test/file1 //编辑file1文件
2)通过另一个终端,查询文本进程的进程号
命令:ps aux | grep vim
[root@localhost ~]# ps aux | grep vim //查看vim进程 root 2558 0.0 0.5 149808 5540 pts/0 S+ 08:22 0:00 vim /test/file1 root 2615 0.0 0.0 112824 976 pts/1 R+ 08:23 0:00 grep --color=auto vim //进程号为2558
3)在/proc目录中查看文本进程的FD
首先介绍一下proc
ls /proc //查看proc目录内容
[root@localhost ~]# ls /proc 1 1828 2102 2291 281 405 694 buddyinfo meminfo 10 1841 2111 2292 285 406 695 bus misc 11 1853 2116 2294 287 407 697 cgroups modules 1120 1854 2126 23 291 41 698 cmdline mounts 1122 1881 2132 2304 292 43 7 consoles mpt 1124 1885 2133 2305 294 44 700 cpuinfo mtrr 1126 1890 2137 2306 296 45 701 crypto net 1136 19 2144 2307 297 47 702 devices pagetypeinfo 1149 1971 2148 2327 3 489 704 diskstats partitions 1151 1985 2150 2332 30 5 706 dma sched_debug 1152 1990 2154 2336 300 506 707 driver schedstat 13 1996 2157 2338 301 525 717 execdomains scsi 1359 2 2158 2341 31 569 736 fb self 1361 20 2159 2360 32 573 738 filesystems slabinfo 1387 2022 2180 24 33 574 744 fs softirqs 14 2034 2183 2407 372 577 749 interrupts stat 1402 2038 2186 2412 373 580 751 iomem swaps 1403 2043 2187 2457 383 582 756 ioports sys 1435 2046 2188 2463 384 586 760 irq sysrq-trigger 15 2054 2192 2464 396 588 761 kallsyms sysvipc 1597 2058 2197 25 397 6 8 kcore timer_list 16 2060 22 2558 398 60 807 keys timer_stats 1655 2065 2204 2570 399 663 809 key-users tty 1665 2074 2208 264 4 665 824 kmsg uptime 1667 2076 2213 2649 400 667 862 kpagecount version 17 2080 2242 2650 401 669 9 kpageflags vmallocinfo 1753 2093 2264 278 402 670 95 loadavg vmstat 18 2094 2274 279 403 692 acpi locks zoneinfo 1815 21 2275 280 404 693 asound mdstat
所有的进程都会存放到该目录中,刚刚的vim进程也在其中(进程号为2558,倒数第八行的第四列),每运行一个进程proc目录中都会多出一个相应的进程号命名的文件夹。
查看2558目录的内容
[root@localhost ~]# ls /proc/2558 attr cwd map_files oom_adj schedstat task autogroup environ maps oom_score sessionid timers auxv exe mem oom_score_adj setgroups uid_map cgroup fd mountinfo pagemap smaps wchan clear_refs fdinfo mounts patch_state stack cmdline gid_map mountstats personality stat comm io net projid_map statm coredump_filter limits ns root status cpuset loginuid numa_maps sched syscall
在第二列的第四行有个fd文件,里面存放了fd信息
查看进程2558的fd信息
[root@localhost ~]# ls /proc/2558/fd 0 1 2 4
2558的fd信息为0,1,2,4