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

时间:2015-11-07 13:34:13

标签: linux kernel init

我正在使用Linux内核,有一点我不明白的是init_task任务的pid。

据我所知,有两个特殊的pid:空闲/交换任务的pid 0和init任务的pid 1。

我找到的每个在线资源(例如onetwo)都说init_task任务代表交换器任务,即它应该有pid 0。

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

请帮我解决这个困惑。

P.S。内核版本是2.4。

1 个答案:

答案 0 :(得分:5)

我混淆的原因是for_each_task宏的棘手定义:

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

即使p似乎从init_task开始,但它实际上是从init_task.next_task开始的,因为条件中的分配。

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

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

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