4

我正在尝试遍历linux内核中的task_struct的孩子并从孩子那里获取信息。我对所有信息都有疑问,所以为了简单起见,让我们将其保留在获取 pid 上。

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

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 分钟,所以尝试记录不同的东西并不是一个真正的选择。

4

2 回答 2

7

你应该使用

list_entry(p, struct task_struct, sibling);

不是

list_entry(p, struct task_struct, children);

何还有,当你通过孩子的时候,你应该锁定 tasklist_lock。

于 2009-09-22T06:14:55.877 回答
1

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

tsk = current;

FWIW,您应该避免复制结构。所以在循环中,做

tsk = list_entry(p, struct task_struct, children);

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

于 2009-09-18T19:16:42.397 回答