在linux系统中,将每一个对象当作文件处理,并且使用文件描述符来标识每一个文件对象。文件描述符是一个非负
整数,唯一标识会话中打开的文件。
每一个进程中最多可以有9个打开文件的描述符。
bash shell保留了3个文件描述符!
0 STDIN 标准输入
1 STDOUT 标准输出
2 STDERR 标准错误
linux下,我们可以使用lsof命令来列出整个linux系统上所有的开放文件描述符,并能显示当前开放的每个文件的
相关的信息,包括后台运行的进程,以及所有登录到系统的用户账户。
常用的选项:-p 指定进程的ID(PID)。
-d 指定要想显示的文件描述符。
eg:
[olz@jieoulinux scripts]$ lsof -a -p $$ -d 0,1,2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 3964 olz 0r CHR 136,1 0t0 4 /dev/pts/1
bash 3964 olz 1u CHR 136,1 0t0 4 /dev/pts/1
bash 3964 olz 2u CHR 136,1 0t0 4 /dev/pts/1
上面的输出中:
COMMAND 表示进程中命令名称的前九个字符
PID 表示进程的ID
user 表示拥有进程的用户的登录名
FD 表示文件描述符编号和访问类型(r-读取 w-写入 u-读取/写入)
TYPE 表示文件类型(CHR-字符 BLK-块 DIR-目录 REG-常规文件)
DEVICE 表示设备的设备编号(主要和次要)
SIZE/OFF 表示如果可用,为文件的大小
NODE 表示文件的节点编号
NAME 表示文件的名称
STDIN,STDOUT,STDERR文件描述符都指向终端,所以输出文件的名称为终端的设备名。
从打开几个备选文件描述符的脚本内部查看lsof命令的结果:
1 #!/bin/bash
2 # testing lsof with file descriptors
3
4 exec 3>test18file1
5 exec 6>test18file2
6 exec 7 7
8 /usr/sbin/lsof -a -p $$ -d 0,1,2,3,4,5,6,7
[olz@jieoulinux scripts]$ ./test18
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
test18 8224 olz 0u CHR 136,1 0t0 4 /dev/pts/1
test18 8224 olz 1u CHR 136,1 0t0 4 /dev/pts/1
test18 8224 olz 2u CHR 136,1 0t0 4 /dev/pts/1
test18 8224 olz 3w REG 8,4 0 529878 /home/olz/scripts/test18file1
test18 8224 olz 6w REG 8,4 0 530177 /home/olz/scripts/test18file2
test18 8224 olz 7r REG 8,4 73 529826 /home/olz/scripts/testfile
阅读(2755) | 评论(0) | 转发(1) |