linux - 是否可以通过 procfs 确定进程打开了哪些 fds 用于读取和写入?

标签 linux linux-kernel procfs

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/

相关文章:

linux - 启动-停止-重启 shell 脚本的功能

linux - 为什么 Linux 内核中的 xtime 变量每 1 毫秒更新一次?

linux-kernel - 如何从 linux 内核模块获取主机名?

linux - procfs 位于内存中,但是在哪里呢?是否有可能获取其 DMA 地址?

linux - 从内核代码的其他部分访问/proc fs 变量

linux - 如何在 Linux 中更新 Webstorm?

linux - tar 如何读取文件以创建存档?

c - 如何解析通过/proc文件传递给内核模块的大量数据?

linux - 如何比较同一文件的两个统计值?

c - 确定给定文本是否为 C 代码