linux进程与它的文件描述符2
四)文件描述符与lsof命令
用lsof命令可以查看系统中所有进程的所有打开文件,前提是你有相应的权限.
我们首先查看当前bash的PID
echo $$
3174
用lsof查看打开的文件.
lsof -p 3174
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 3174 root cwd DIR 8,1 4096 32577 /root
bash 3174 root rtd DIR 8,1 4096 2 /
bash 3174 root txt REG 8,1 797784 309511 /bin/bash
bash 3174 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so
bash 3174 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so
bash 3174 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so
bash 3174 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so
bash 3174 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
bash 3174 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so
bash 3174 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so
bash 3174 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
bash 3174 root mem REG 8,1 119288 147733 /lib/ld-2.7.so
bash 3174 root mem REG 8,1 25700 767172 /usr/lib/gconv/gconv-modules.cache
bash 3174 root 0u CHR 136,1 3 /dev/pts/1
bash 3174 root 1u CHR 136,1 3 /dev/pts/1
bash 3174 root 2u CHR 136,1 3 /dev/pts/1
bash 3174 root 255u CHR 136,1 3 /dev/pts/1
在/proc中查看打开的文件
ls -l /proc/3174/fd
total 0
lrwx------ 1 root root 64 2010-10-10 13:13 0 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:13 1 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:13 2 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:15 255 -> /dev/pts/1
我们发现lsof不只是显示文件描述符,在lsof输出的最后四个文件是该进程的打开文件的文件描述符,0u代表的文件描述符为0,而255u代表的文件描述符为255,u的意思为可读可写.
除了这四个文件描述符外,在FD一栏还有cwd,rtd,txt,mem等几种类型,它们的意义如下:
cwd代表当前目录,这里是/root
rtd代表根目录,这里是/
txt代表执行的程序,这里是/bin/bash
mem代表映射到内存的文件,这里是/lib/libc-2.7.so等动态链接库
TYPE一栏表示文件/目录的类型,DIR代表目录,REG代表普通文件,CHR代表字符设备.
我们在伪终端1,执行vi -d /etc/hosts /etc/mtab
在伪终端2,用lsof查看打开的文件.
lsof -p 6195
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vi 6195 root cwd DIR 0,3 0 1 /proc
vi 6195 root rtd DIR 8,1 4096 2 /
vi 6195 root txt REG 8,1 1699024 686572 /usr/bin/vim.basic
vi 6195 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so
vi 6195 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so
vi 6195 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so
vi 6195 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so
vi 6195 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
vi 6195 root mem REG 8,1 17424 147652 /lib/libattr.so.1.1.0
vi 6195 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so
vi 6195 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so
vi 6195 root mem REG 8,1 23616 767588 /usr/lib/libgpm.so.2.0.0
vi 6195 root mem REG 8,1 29360 147707 /lib/libacl.so.1.1.0
vi 6195 root mem REG 8,1 109464 146602 /lib/libselinux.so.1
vi 6195 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
vi 6195 root mem REG 8,1 119288 147733 /lib/ld-2.7.so
vi 6195 root 0u CHR 136,0 2 /dev/pts/0
vi 6195 root 1u CHR 136,0 2 /dev/pts/0
vi 6195 root 2u CHR 136,0 2 /dev/pts/0
vi 6195 root 4u REG 8,1 12288 480777 /etc/.hosts.swp
vi 6195 root 5u REG 8,1 12288 482077 /etc/.mtab.swp
我们看到vi创建了临时文件/etc/.hosts.swp和/etc/.mtab.swp,同时它的执行程序是/usr/bin/vim.basic,应该是确实是vi的二进制程序.
cwd是/proc,说明伪终端1下的当前目录是/proc。
其实我们可以通过w确认当前系统的伪终端,再通过lsof|grep 'pts/0'查看使用该伪终端的PID,最后用lsof -p PID查看该用户在做什么.
如果有具体的用户名,可以直接用lsof -u username来查看该用户当前加载的文件.
五)文件描述符的限制
每个进程允许打开文件的实际数目是由内核决定的,但是可以使用sysconf函数在运行时进行查看.如下:
vi process_limit.c
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc,char *argv[])
{
u_long process;
process = sysconf(_SC_OPEN_MAX);
printf("current process total:%lu\n", process);
return 0;
}
编译链接:
gcc process_limit.c -o process_limit
./process_limit
current process total:819200
进程可以打开文件的总数为819200,与ulimit -n(打开文件的总数)一致.
用lsof命令可以查看系统中所有进程的所有打开文件,前提是你有相应的权限.
我们首先查看当前bash的PID
echo $$
3174
用lsof查看打开的文件.
lsof -p 3174
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 3174 root cwd DIR 8,1 4096 32577 /root
bash 3174 root rtd DIR 8,1 4096 2 /
bash 3174 root txt REG 8,1 797784 309511 /bin/bash
bash 3174 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so
bash 3174 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so
bash 3174 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so
bash 3174 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so
bash 3174 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
bash 3174 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so
bash 3174 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so
bash 3174 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
bash 3174 root mem REG 8,1 119288 147733 /lib/ld-2.7.so
bash 3174 root mem REG 8,1 25700 767172 /usr/lib/gconv/gconv-modules.cache
bash 3174 root 0u CHR 136,1 3 /dev/pts/1
bash 3174 root 1u CHR 136,1 3 /dev/pts/1
bash 3174 root 2u CHR 136,1 3 /dev/pts/1
bash 3174 root 255u CHR 136,1 3 /dev/pts/1
在/proc中查看打开的文件
ls -l /proc/3174/fd
total 0
lrwx------ 1 root root 64 2010-10-10 13:13 0 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:13 1 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:13 2 -> /dev/pts/1
lrwx------ 1 root root 64 2010-10-10 13:15 255 -> /dev/pts/1
我们发现lsof不只是显示文件描述符,在lsof输出的最后四个文件是该进程的打开文件的文件描述符,0u代表的文件描述符为0,而255u代表的文件描述符为255,u的意思为可读可写.
除了这四个文件描述符外,在FD一栏还有cwd,rtd,txt,mem等几种类型,它们的意义如下:
cwd代表当前目录,这里是/root
rtd代表根目录,这里是/
txt代表执行的程序,这里是/bin/bash
mem代表映射到内存的文件,这里是/lib/libc-2.7.so等动态链接库
TYPE一栏表示文件/目录的类型,DIR代表目录,REG代表普通文件,CHR代表字符设备.
我们在伪终端1,执行vi -d /etc/hosts /etc/mtab
在伪终端2,用lsof查看打开的文件.
lsof -p 6195
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vi 6195 root cwd DIR 0,3 0 1 /proc
vi 6195 root rtd DIR 8,1 4096 2 /
vi 6195 root txt REG 8,1 1699024 686572 /usr/bin/vim.basic
vi 6195 root mem REG 8,1 47520 147727 /lib/libnss_files-2.7.so
vi 6195 root mem REG 8,1 43472 147716 /lib/libnss_nis-2.7.so
vi 6195 root mem REG 8,1 88968 147720 /lib/libnsl-2.7.so
vi 6195 root mem REG 8,1 31536 147722 /lib/libnss_compat-2.7.so
vi 6195 root mem REG 8,1 4636768 782032 /usr/lib/locale/locale-archive
vi 6195 root mem REG 8,1 17424 147652 /lib/libattr.so.1.1.0
vi 6195 root mem REG 8,1 14616 147734 /lib/libdl-2.7.so
vi 6195 root mem REG 8,1 1375536 147730 /lib/libc-2.7.so
vi 6195 root mem REG 8,1 23616 767588 /usr/lib/libgpm.so.2.0.0
vi 6195 root mem REG 8,1 29360 147707 /lib/libacl.so.1.1.0
vi 6195 root mem REG 8,1 109464 146602 /lib/libselinux.so.1
vi 6195 root mem REG 8,1 256288 147710 /lib/libncurses.so.5.7
vi 6195 root mem REG 8,1 119288 147733 /lib/ld-2.7.so
vi 6195 root 0u CHR 136,0 2 /dev/pts/0
vi 6195 root 1u CHR 136,0 2 /dev/pts/0
vi 6195 root 2u CHR 136,0 2 /dev/pts/0
vi 6195 root 4u REG 8,1 12288 480777 /etc/.hosts.swp
vi 6195 root 5u REG 8,1 12288 482077 /etc/.mtab.swp
我们看到vi创建了临时文件/etc/.hosts.swp和/etc/.mtab.swp,同时它的执行程序是/usr/bin/vim.basic,应该是确实是vi的二进制程序.
cwd是/proc,说明伪终端1下的当前目录是/proc。
其实我们可以通过w确认当前系统的伪终端,再通过lsof|grep 'pts/0'查看使用该伪终端的PID,最后用lsof -p PID查看该用户在做什么.
如果有具体的用户名,可以直接用lsof -u username来查看该用户当前加载的文件.
五)文件描述符的限制
每个进程允许打开文件的实际数目是由内核决定的,但是可以使用sysconf函数在运行时进行查看.如下:
vi process_limit.c
源代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc,char *argv[])
{
u_long process;
process = sysconf(_SC_OPEN_MAX);
printf("current process total:%lu\n", process);
return 0;
}
编译链接:
gcc process_limit.c -o process_limit
./process_limit
current process total:819200
进程可以打开文件的总数为819200,与ulimit -n(打开文件的总数)一致.
转载于:https://blog.51cto.com/xuanjicto/725314