gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:36 27 4
gpt4 key购买 nike

procfs 会告诉我某个进程在任何给定时间正在使用哪个 fds。但是有没有办法确定哪些是开放阅读还是哪些是写作?

在下面的输出中,显然进程所有者(用户“x”)对链接/文件具有读/写访问权限,但这与知道 pid 4166 是否正在写入或读取特定 fd 不同.

$ ls -l /proc/4166/fd/total 0lrwx------ 1 x x 64 Mar 12 21:15 0 -> /dev/pts/3lrwx------ 1 x x 64 Mar 12 21:15 1 -> /dev/pts/3lrwx------ 1 x x 64 Mar 12 21:15 2 -> /dev/pts/3lrwx------ 1 x x 64 Mar 12 21:15 255 -> /dev/pts/3

我知道 lsof 实用程序可以执行此操作:

$ lsof -p 4166 | grep CHRbash    4166    x    0u   CHR  136,3      0t0      6 /dev/pts/3bash    4166    x    1u   CHR  136,3      0t0      6 /dev/pts/3bash    4166    x    2u   CHR  136,3      0t0      6 /dev/pts/3bash    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:    0flags:  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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com