procfs 会告诉我某个进程在任何给定时间正在使用哪个 fds。但是有没有办法确定哪些是开放阅读还是哪些是写作?
在下面的输出中,显然进程所有者(用户“x”)对链接/文件具有读/写访问权限,但这与知道 pid 4166 是否正在写入或读取特定 fd 不同.
$ ls -l /proc/4166/fd/ total 0 lrwx------ 1 x x 64 Mar 12 21:15 0 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 1 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 2 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 255 -> /dev/pts/3
我知道 lsof 实用程序可以执行此操作:
$ lsof -p 4166 | grep CHR bash 4166 x 0u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 1u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 2u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 255u CHR 136,3 0t0 6 /dev/pts/3
lsof 的联机帮助页说,例如 fd 数字(0、1、2、255)后面的那些尾随 u 的意思是 fd 是开放的,可以读写。
但我的问题是是否可以通过 procfs 而不是 lsof 获取此信息。由于各种原因,在另一种编程语言中执行 lsof 对我来说不如轮询 procfs 方便,所以我想知道是否有直接的方法可以在那里做到这一点。
最佳答案
我按照建议深入研究了 lsof 代码,并找到了答案。
本质上,lsof 实用程序在 /proc/XX/fdinfo/YY
中打开文件,其中 XX
是进程 PID,YY
是文件描述符编号。这些文件中的每一个都是一个很小的文本文件,如下所示:
user@host:/proc/6095/fdinfo$ cat 8 pos: 0 flags: 02004002
查阅其他联机帮助页,“标志”字段指的是传递给开放系统命令的标志 relevant man page for open(2) here .所以只是为了让它更难一点,当然 open()
以符号方式定义所有这些标志,而不是数字方式。那么 02004002
(上面的示例)的标志是什么意思?
我在 /usr/include/i386-linux-gnu/bits/fcntl-linux.h
中找到了作为 libc6-dev 一部分的定义,包括摘录的这些:(警告不要相信这些您系统的值,请自行查找,因为它们可能不同)
# define O_CREAT 0100 # define O_APPEND 02000 #define O_ACCMODE 0003 #define O_RDONLY 00 #define O_WRONLY 01 #define O_RDWR 02 # define O_CREAT 0100 /* Not fcntl. */ # define O_TRUNC 01000 # define __O_DIRECTORY 0200000 # define O_DIRECTORY __O_DIRECTORY /* Must be a directory. */ # define O_NONBLOCK 04000 # define __O_CLOEXEC 02000000
因此给定标志:02004002,该文件看起来像是打开读/写 (02)、非阻塞 (4000)、执行时关闭 (2000000)。
HTH 其他人对这些点感到困惑。
关于linux - 是否可以通过 procfs 确定进程打开了哪些 fds 用于读取和写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367367/