如何在Linux中查找属于同一进程的线程

时间:2014-01-08 22:18:43

标签: c linux multithreading process linux-kernel

由于在Linux中为每个线程分配了task_struct,如何找到属于同一进程的线程?

所以,那是一般性的问题。详细说明,我需要编写一个内核函数来遍历属于进程(p)的线程,给定指向其task_struct或pid的指针,并对它们执行某些操作(例如,收集一些信息)。

3 个答案:

答案 0 :(得分:5)

linux/sched.h具有此功能:

struct task_struct *next_thread(const struct task_struct *p);

以及其他支持功能,例如get_nr_threads()

你必须像例如一样迭代。

struct task_struct *t = task;
do {
    /*....*/
    t = next_thread(t);
} while (t != task);

另请参阅fs/proc/中的代码,其中包含大量代码来遍历进程和线程(其运行时信息可在/proc/<pid>/目录树中看到)

答案 1 :(得分:3)

实际上,您根本不需要task_struct

有关使用给定pid打印进程的线程的示例代码,请参阅my gist

<强>参考

在命令行(online version)输入man proc,然后找到 /proc/[pid]/task 的条目。

从手册页引用:

  

这是一个包含每个子目录的目录   线程在这个过程中。每个子目录的名称是   线程的数字线程ID([tid])。

请注意/proc/[pid]/task中的一个子目录是[pid](您正在检查的程序的pid)。

然后,您可以使用目录/proc/[pid]/task/[tid]中的伪文件为每个线程pid [tid]收集其他信息。

没有C代码

ps -mo THREAD -p <pid>应该有用。

答案 2 :(得分:0)

答案在于

 struct list_head ptrace_list;

包含在task_struct

link将其描述为

  

跟踪流程的父级列表

然后您将使用

遍历它
 list_for_each_entry()