我正在尝试实现一个系统调用,它允许我获取当前进程的线程数。我是 Linux 内核的新手,所以对它的理解有限。
目前,我正在尝试遍历所有 task_struct
,并将它们的线程组领导者的 PID 与当前线程组领导者的 PID 进行比较:
// ...
int nthreads = 0;
struct task_struct *task_it;
for_each_process(task_it) {
if (task_it->group_leader->pid == current->group_leader->pid) {
nthreads++;
}
}
// ...
但是,这似乎不起作用(生成一些 pthread 的快速测试仍然给出 1
。group_leader
对相同的过程?
最佳答案
您的代码的问题在于内核调用 PID(task_struct
的 pid
字段)是用户空间调用 TID 的内容(即它是返回的内容sys_gettid()
并且每个线程都是唯一的)。用户空间称为 PID 的东西在内核中称为 TGID(“任务组 ID”)——这就是 sys_getpid()
系统调用返回的内容。
虽然您不需要实际检查 TGID - 只需比较 struct task_struct *
指针就足够了:
if (task_it->group_leader == current->group_leader) {
顺便说一句,您可以遍历 current
是其成员的 thread_group
列表(使用 while_each_thread()
),然后你根本不需要任何测试。或者甚至更好,只需使用 get_nr_threads(current)
。
请注意,所有循环任务列表的方法都需要包装在 rcu_read_lock();
/rcu_read_unlock();
中才能正确。
关于multithreading - 列出当前进程中的所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13002444/