有没有办法真正了解哪些线程被打开以及哪些应用程序打开了它们?
答案 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)