c - 内核如何使用task_struct?

标签 c linux process linux-kernel kernel

我是一名研究涉及 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/

相关文章:

main 中的命令行参数

php - 通过另一台计算机上的网络服务器访问本地文件

C++ wxWidgets Gui-App关闭后保留在内存中

c - 为什么我得到一个close : Bad file descriptor error for this fork pipe c program?

c - OpenGL正弦函数向点移动

c - 如何在另一个用户磁贴上的多个用户磁贴上显示 ICredentialProviderCredentialv2

linux - 移动目录中具有重复文件名的多个文件

python - 如何获取子进程的打开文件?

linux - 如何在 linux 进程中找到属于堆的页面?

c - 限制真实(固定/浮点)值的最快方法?