内核:如何从进程的 task_struct 中找到所有线程?

Posted

技术标签:

【中文标题】内核:如何从进程的 task_struct 中找到所有线程?【英文标题】:kernel: how to find all threads from a process's task_struct? 【发布时间】:2012-01-17 11:27:27 【问题描述】:

给定一个进程或线程的任务结构,遍历属于同一进程的所有其他线程的习惯用法是什么?

【问题讨论】:

【参考方案1】:

Linux 不区分进程(任务)和线程。库调用 fork() 和 pthread_create() 使用相同的系统调用 clone()。 fork() 和 pthread_create() 之间的区别在于传递给 clone() 的位掩码。该位掩码描述了哪些资源(内存、文件、文件系统、信号处理程序……)。有关详细信息,请参阅 man clone(2)。

无论如何,clone() 调用中有一个称为线程组的东西和一个特殊标志,表示新进程属于同一个线程组。此机制通常用于将使用 clone() 创建的所有任务放在一起,并在位掩码中指定 CLONE_THREAD。 对于这个线程,linux/sched/signal.h 包含文件中存在宏 while_each_thread。它是这样使用的:

struct task_struct *me = current;
struct task_struct *t = me;
do 
    whatever(t);
 while_each_thread(me, t);

【讨论】:

以上是关于内核:如何从进程的 task_struct 中找到所有线程?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )

Linux内核第六节 20135332武西垚

进程控制块的task_struct结构

Linux内核是如何创建一个新进程的?

Linux 内核:线程与进程 - task_struct 与 thread_info

了解Linux内核如何管理一个进程的内存