最准确的方法是直接查看/proc/[PID]/fd目录,它由内核维护,包含每个文件描述符指向的实际资源;配合/proc/[PID]/fdinfo/[FD]可获取偏移、标志等详细状态;lsof则提供语义化解释但受权限限制。

Linux怎么查看具体的文件描述符

直接看 /proc/[PID]/fd 目录最准

Linux 内核为每个进程在 /proc/[PID]/fd 下维护一组符号链接,每个链接名就是文件描述符编号(如 0312),指向它实际打开的资源。这是最底层、最权威的来源,不依赖外部工具,也不受权限过滤干扰。

操作步骤:

注意:如果看到 socket:[12345]pipe:[67890],说明该 fd 指向网络套接字或管道,不是普通文件;anon_inode:[eventpoll] 则是 epoll 实例——这些都合法,也是 fd 的常见目标。

用 lsof -p [PID] 看带语义的详情

lsof 不是“数 fd”,而是解释 fd 的含义:它告诉你这个 fd 是普通文件、目录、socket 还是内存映射,以及访问模式(rwu)、inode、设备号等。适合排查“为什么某个 fd 占着不放”或“哪个 socket 对应哪个连接”。

常见陷阱:

查某个 fd 的详细信息用 /proc/[PID]/fdinfo/[FD]

光知道 3 -> /dev/tty 不够?想确认它是否被设为非阻塞、是否启用 close-on-exec、当前读写偏移量?那就得看 /proc/[PID]/fdinfo/[FD]

例如:

cat /proc/1234/fdinfo/3

输出类似:

pos:0
flags:02004002
mnt_id: 12
ino:12345

其中 flags 是八进制掩码,02004002 对应 O_RDWR|O_LARGEFILE|O_CLOEXECpos 是当前文件偏移(对 socket 或 pipe 恒为 0)。

关键点:

别误用 stat 或 ls 查 fd 本身

statls -l 盯着看的,其实是“文件路径”,并不是“文件描述符”。也正因为如此,直接对 /proc/1234/fd/3 执行 stat,拿到的并不是原始文件的元数据;它返回的是这个符号链接本身的属性。比如,它的创建时间通常固定在进程启动那个时刻,而不是目标文件(例如 /etc/passwd)真实的 mtimeinode

真正要查目标文件详情,得先用 readlink /proc/1234/fd/3 拿到路径,再 stat 那个路径。但注意:如果目标是 socket、pipe 或已删除仍被占用的文件(deleted 标记),readlink 返回的路径无法直接 stat

所以:查 fd 本身状态,盯死 /proc/[PID]/fd/proc/[PID]/fdinfo/[FD];查目标文件属性,按需结合 readlink + stat,并接受其局限性。

本文转载于:https://www.php.cn/faq/2961569.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。