【问题标题】:Count of references to a object referenced by file descriptor对文件描述符引用的对象的引用计数
【发布时间】:2017-07-10 22:42:30
【问题描述】:

是否有可能以编程方式找出已打开 linux 上给定文件描述符引用的对象的进程数?

如果是,如果是文件、管道或其他有什么区别吗?

【问题讨论】:

  • AFAIK,没有标准的方法可以做到这一点。毫无疑问,您可以在/dev/kmem 中寻找答案;尽管不太可能,但您可以通过/proc 文件系统找到它。文件的类型不应该有任何区别。您可能会注意到只有一个进程可以打开给定的文件描述符。然后它可以制作它自己的副本(dup2() 等),或者它可以使用它的副本创建新进程(fork() 等)。单个文件可能有多个跨多个进程的打开文件描述,以及多个进程共享一个打开文件描述。
  • 你是在问有多少进程正在打开文件? AFAIK 文件描述符对于进程是唯一的。
  • @ed 是的,我的意思是打开文件、管道或其他东西的进程数。
  • 我想不出在 Linux 下这样做的方法——但我可能错了。用例是什么?
  • lsof 能够枚举所有进程中的所有打开文件。 Lsof 通过检查 /proc 文件系统来做到这一点。 lsof 在检查内核数据结构时支持多种方言,以支持不同的操作系统,如 Linux 或 FreeBsd。

标签: c linux posix


【解决方案1】:

奇怪的是,fuser 程序及其输出已被 POSIX 标准化。您可以使用popen 调用它并解析其输出。除非用户有特权,否则列表将不完整,并且这种方法天生就容易出现竞争。

在 Linux 上,您可以读取 /proc/*/fd 目录的内容并检查是否引用了相同的文件描述符。 (关于权限和种族的相同评论也适用。)如果您对同一文件 description 对象的引用感兴趣(它们不仅共享同一个文件,而且还共享相同的文件偏移量,因为它们是由 @ 创建的987654324@/dup2fork),您必须使用kcmp 系统调用进一步过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多