如何列出Linux中每个应用程序打开的线程?

时间:2010-07-20 13:27:29

标签: c++ linux

有没有办法真正了解哪些线程被打开以及哪些应用程序打开了它们?

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:4)

在现代Linux中,线程非常类似于进程。每个线程都有一个LWP(“轻量级进程”)标识符,该标识符在内部实现为PID。但是,如果为PID查询这种“轻量级进程”(即线程),则系统产生产生线程的进程的PID(而不是LWP)。另请注意,如果进程只有一个线程,则它的LWP将等于其PID。

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

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

$ 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中,它都可用。

答案 2 :(得分:3)

我想ps -L应该可以做到这一点。

以下是ps documentation

不确定您是否询问如何执行该程序,但在这种情况下,由于ps是开源的,因此您可以查看来源。