我是一名研究涉及 Linux 进程的学生,我需要更多地了解它们才能继续我的实验。在网上阅读几本书和一些东西时,我遇到了 task_struct
,我不确定我是否完全理解它,并希望对我现有的想法进行确认/更正。
据我所知,task_struct
是充当进程描述符的 C 结构,包含内核可能需要了解的有关进程的所有信息。在进程内核堆栈的末尾存在另一个结构 thread_info
,它有一个指向进程 task_struct
的指针。
另一个问题:如何访问进程的task_struct
?是否有计算来找到它的 thread_info
的位置?内核中是否有宏/函数?
最佳答案
是的,task_struct
结构包含有关进程的所有信息。您可以使用 current
宏获取指向描述当前进程的结构的指针,如下所示:
struct task_struct *p = current;
如果你想获得描述给定pid
进程的结构,你可以使用find_task_by_vpid
函数,如下所示:
read_lock(&tasklist_lock);
p = find_task_by_vpid(pid);
if (p) get_task_struct(p);
read_unlock(&tasklist_lock);
if (p == NULL) {
// Task not found.
}
// Later, once you're finished with the task, execute:
put_task_struct(p);
最后,如果你想遍历所有进程,你可以使用for_each_process
如下:
read_lock(&tasklist_lock);
for_each_process(p) {
// p is a pointer to a task_struct instance.
}
read_unlock(&tasklist_lock);
如果您希望独占访问任务列表以便能够更改结构中的一个或多个字段,则必须使用write_lock_irqsave
而不是read_lock
.
关于c - 内核如何使用task_struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56531880/