【问题标题】:How to list threads opened by every application in Linux?如何列出 Linux 中每个应用程序打开的线程?
【发布时间】:2010-07-20 13:27:28
【问题描述】:

有没有办法实时知道打开了哪些线程以及打开了哪些应用程序?

【问题讨论】:

  • Ubuntu 通常意味着 Linux :)
  • @Nikolai 我的错,我完全看错了标签,对不起。
  • Night Walker,请不要不必要地缩小您的问题范围。 Ubuntu 只是 Linux 的一种变体,在这个系统中没有什么让 编程 与众不同。在 SuperUser 或 ServerFault 上,可以将其与其他 Linux 分开。然而,当谈到通用的 Linux 编程 问题时,Ubuntu 并没有什么不同。 特别是如果你没有指定 [linux] 标签。

标签: c++ linux


【解决方案1】:

您可以查看/proc/<PID>/task/(其中<PID> 是一个进程ID),其中包含许多子目录,每个子目录的名称都与该任务中的一个线程的线程ID 相同。

请注意,这只是一种实时的——除非你在这段时间内“冻结”整个系统,否则你得到的信息总是过时的,因为一个进程可能会创建或销毁线程,即使是您正在查看数据。

【讨论】:

    【解决方案2】:

    在现代 Linux 中,线程与进程非常相似。每个线程都有一个 LWP(“轻量级进程”)标识符,它在内部实现为 PID。但是,如果向此类“轻量级进程”(即线程)查询 PID,则系统会生成生成线程的进程的 PID(而不是 LWP)。还要注意,如果进程只有一个线程,它的 LWP 将等于它的 PID。

    ps 能够处理带有-L 修饰符的线程,正如ereOn 在他的answer 中描述的那样。但我应该注意ps 不仅仅用于手动调用。它具有以易于被其他程序解析的方式打印输出的能力。

    以下命令将打印系统中所有 (-A) 线程 (-L) 的 LWP (-o lwp=) 和 PID (-o pid=)。每个字符串代表一个线程,第二列是产生它的进程:

    $ ps -A -L -o lwp= -o pid=
    ...
    27747 27747
    27749 27749
    27750 27750
    27751 27750
    27752 27750
    27755 27750
    27756 27750
    27772 27772
    27858 27858
    30457 30457
    30886 30886
    

    用 C 或 C++ 很容易解析,不是吗?要从您的程序中实际读取此内容,您可以使用popen 或其C++ equivalents 之一。

    请注意,使用ps 不仅比阅读/proc 更容易。它也比手动解析/proc 文件系统安全得多。 ps 是一个 POSIX 命令*,它保证可以工作;它在 Linux 下使用/proc,但这是内部细节。当底层基础设施发生变化时,ps 将被重写并继续工作,而您的代码如果基于/proc 编写,则会中断。


    *老实说,POSIX 没有指定-L 开关。但在任何具有 GNU 工具链的 Linux 中,它都将可用。

    【讨论】:

      【解决方案3】:

      我猜ps -L 应该可以解决问题。

      这里是psdocumentation

      不确定您是否询问如何以编程方式执行此操作,但在这种情况下,由于 ps 是开源的,因此您可能可以查看源代码。

      【讨论】:

      • 不确定我将使用哪种语言实现。
      • 我确信您使用的任何语言都可以调用ps
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 2022-11-12
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      相关资源
      最近更新 更多