如何在不使用 lsof 命令的情况下显示带有线程 ID 的打开文件描述符

如何在不使用 lsof 命令的情况下显示带有线程 ID 的打开文件描述符

如何在不使用的情况下显示带有线程ID的打开文件描述符lsof?我知道存在类似的问题,但答案不包括线程详细信息。

答案1

除了给出的答案之外,也许值得一提的是,在 Linux 中,由进程启动的所有线程通常共享同一组文件描述符。因此,两者:

ls /proc/$parent_pid/task/$task/fdls /proc/$parent_process/fd

通常会产生相同的输出,这意味着子进程继承其父进程引用的文件描述符。 “lsof”手册实际上也在 -K 选项文档下指定了这一点:

“一般来说,线程和任务继承调用者的文件,但可能会关闭一些文件并打开其他文件,因此 lsof 始终报告线程和任务的所有打开文件。”

因此,为了消除任何潜在的歧义(可能是由前面的答案创建的),列表/proc/$parent_pid/$task/fd不能保证 $task 是引用该目录中的文件描述符 id 的线程。如果您需要一种可靠的方法来告诉哪个线程打开了特定的文件描述符,您可以让strace程序跟踪系统调用open(),例如需要内核分配文件描述符的系统调用。

答案2

在 Linux 上:

ls -l /proc/*/task/*/fd

与 相反lsof,它只列出文件描述符,而不列出映射文件、根目录和当前目录。

答案3

嗯,你可以检查一下/proc/TID/fd....我不明白这里有什么问题。

相关内容