首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在linux内核中遍历task_struct->子进程

在linux内核中遍历task_struct->子进程
EN

Stack Overflow用户
提问于 2009-09-18 18:40:10
回答 2查看 12.3K关注 0票数 4

我试图在linux内核中遍历task_struct的子节点,并从这些子节点获取信息。我对所有的信息都有问题,所以为了简单起见,让我们把它放在获取pid上。

这是我的代码的相关部分。

代码语言:javascript
运行
复制
struct list_head * p;
struct task_struct ts, *tsk;
pid_t tmp_pid;
INIT_LIST_HEAD(&ts.children);

current = tsk;

list_for_each(p, &(tsk->children)){
     ts = *list_entry(p, struct task_struct, children);
     tmp_pid = ts.pid;
     printk("the pid is %d\n", tmp_pid);
}

我认为问题出在list_entry上,但我不知道如何修复它,我能找到的所有示例似乎都是以相同的方式命名的。

这应该会打印出所有的子PID,但我总是得到相同的数字-17……它大约是10^9或10^11。

有人能帮我吗?编译大约需要30分钟,所以尝试记录不同的东西并不是一个真正的选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-22 06:14:56

你应该使用

代码语言:javascript
运行
复制
list_entry(p, struct task_struct, sibling);

代码语言:javascript
运行
复制
list_entry(p, struct task_struct, children);

还有,当你浏览孩子的时候,你应该锁定tasklist_lock。

票数 7
EN

Stack Overflow用户

发布于 2009-09-18 19:16:42

对tsk的分配方向错误。current包含当前任务;要初始化tsk,您需要编写

代码语言:javascript
运行
复制
tsk = current;

FWIW,你应该避免复制结构。因此,在循环中,

代码语言:javascript
运行
复制
tsk = list_entry(p, struct task_struct, children);

因此赋值给任务指针,而不是复制整个任务结构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1446239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档