【问题标题】:How to use lsof(List Opened Files) in a C/C++ application?如何在 C/C++ 应用程序中使用 lsof(List Opened Files)?
【发布时间】:2011-05-27 02:07:05
【问题描述】:

有没有办法使用 获取所有打开的套接字?我知道lsof 命令,这就是我正在寻找的,但是如何在 应用程序中使用它?

这个想法是通过其port 编号和pid 来获取打开的套接字的FD。

【问题讨论】:

    标签: c++ c++ c++ c sockets unix lsof


    【解决方案1】:

    只需打开 /proc/net 中的文件,例如 /proc/net/tcp、/proc/net/udp 等。无需费力地通过 lsof 源。 :)

    【讨论】:

    • 我怎样才能从 /proc/net/tcp 映射端口:FD?我在那里没有看到这样的信息
    • 端口在/proc/net/tcp中local_address和remote_address的:之后进行了十六进制编码。然后,您必须使用 readlink() 扫描所有 /proc/*/fd 并解析出该符号链接的数量,例如socket:[1771485] 1771485 是 inode 编号,您会在 /proc/net/tcp(或任何其他类似文件,具体取决于它是 tcp/udp 和 ipv4 还是 ipv6 等)中找到该 inode 编号。
    【解决方案2】:

    如果您不想复制/粘贴或重新实现 lsof 代码块,并且它没有构建任何您可以利用的有用库,您仍然可以打开一个指向 lsof 进程的管道并仔细阅读它的输出.

    【讨论】:

    • 非常感谢,这将是我的 plan-b 解决方案,Billy 的解决方案由于某种原因失败了。
    • @Kiril:最主要的可能就是便携性。 lsof 研究如何在各种系统上获取数据,其中只有一些提供 /proc,即使在这些系统中,/proc 的内容也可能不同。不过,如果您不需要太多的可移植性,那么去掉 lsof 会使其更快,而且很可能也更简单。
    • 我不需要太多的可移植性,该应用程序应该只适用于 RHEL 4 和 5。是的,我选择比利的答案是因为性能。另外,困扰我的是,如果 lsof 的版本与我正在测试的版本不同,则解析可能会出现问题。但是我会实现这个,以防第一种方法失败,所以我会同时使用。
    【解决方案3】:

    【讨论】:

    • 网址似乎无效
    【解决方案4】:

    lsof 命令是专门准备的,因此它可以从包括 C 在内的其他程序中使用,有关详细信息,请参阅man lsof其他程序的输出部分。例如,您可以使用-F p 调用lsof,它将输出以'p' 为前缀的进程的pid

    $ lsof -F p /some/file
    p1234
    p4321
    

    然后您可以使用 popen 在子进程中执行此命令并从其标准输出中读取。

    【讨论】:

      【解决方案5】:

      在 C(或 C++)中,您可以使用 NETLINK_SOCK_DIAG 接口。这是一个套接字,可让您访问所有这些信息。您可以过滤各种参数,例如套接字所连接的接口。

      不过,文档是备用的,但我编写了一个低级测试,以查看是否可以在有人打开新套接字时获取事件,但这不起作用。话虽如此,要列出现有的套接字,您可以使用以下代码作为一个很好的起点:

      Can the NETLINK/SOCK_DIAG interface be used to listen for `listen()` and `close()` events of said socket?

      我认为这比解析/proc/net/tcp 和其他类似文件更干净。你得到相同的信息,但它以二进制形式提供给你。

      使用libnml 库也可能更简单,它是套接字之上的一个层。它对所有呼叫进行许多额外的验证。然而,就像基本的NETLINK 接口一样,它的文档也不是很好(即绑定是否重要,可以与 TCP 或 UDP 一起使用的标志等)。好消息是:您始终可以阅读源代码以更好地了解什么是继续。

      【讨论】:

        猜你喜欢
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        相关资源
        最近更新 更多