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 に答える