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

Pau*_*aul 3 linux kernel init

我正在玩Linux内核,有一点我不明白的是init_task任务的pid .

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

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

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

请帮我解决这个困惑.

PS内核版本是2.4.

Pau*_*aul 5

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

#define for_each_task(p) \
        for (p = &init_task ; (p = p->next_task) != &init_task ; )
Run Code Online (Sandbox Code Playgroud)

即使它似乎pinit_task它开始,它实际上是从init_task.next_task因为条件中的赋值开始的.

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

p = init_task.next_task;
while(p != &init_task)
{
    /* ... */
    p = p->next_task;
}
Run Code Online (Sandbox Code Playgroud)

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