关于init_task(pid 0或pid 1?)的困惑

我正在玩Linux内核,有一件事我不明白是init_task任务的PID。

据我所知,有两个特殊的pid:idle / swapper任务的pid 0,init任务的pid 1。

每个在线资源(例如一个 , 两个 )我都可以find, init_task任务代表了交换任务,即它应该有pid 0。

但是当我使用从init_task开始的for_each_processmacros打印所有的pid时,我得到pid 1作为第一个进程。 我根本没有得到0。 这意味着init_task具有pid 1,并且它是init任务(?!)。

请帮我解决这个困惑。

PS内核版本是2.4。

Solutions Collecting From Web of "关于init_task(pid 0或pid 1?)的困惑"

我困惑的原因是for_each_task宏的一个棘手的定义:

 #define for_each_task(p) \ for (p = &init_task ; (p = p->next_task) != &init_task ; ) 

即使看起来pinit_task开始,它实际上是从init_task.next_task开始的,因为条件中的赋值。

所以for_each_task(p) { /* ... */ }可以被重写为:

 p = init_task.next_task; while(p != &init_task) { /* ... */ p = p->next_task; } 

可以看出,交换器进程不是迭代的一部分。