由于在Linux中为每个线程分配了task_struct
,如何找到属于同一进程的线程?
所以,那是一般性的问题。详细说明,我需要编写一个内核函数来遍历属于进程(p)的线程,给定指向其task_struct
或pid的指针,并对它们执行某些操作(例如,收集一些信息)。
答案 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()
。