关于 init_task 的困惑(pid 0 还是 pid 1?)
Confusion about init_task (pid 0 or pid 1?)
我正在玩 Linux 内核,我不明白的一件事是 init_task
任务的 pid。
据我所知,有两个特殊的 pid:idle/swapper 任务的 pid 0 和 init 任务的 pid 1。
我能找到的每个在线资源(例如 one, two)都说 init_task
任务代表交换器任务,即它应该有 pid 0。
但是当我使用从 init_task
开始的 for_each_process
宏打印所有 pid 时,我得到 pid 1 作为第一个进程。我根本没有得到 pid 0。这意味着 init_task
的 pid 为 1,并且它是初始化任务 (?!)。
请帮我解决这个困惑。
P.S。内核版本是 2.4.
让我感到困惑的原因是 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;
}
可以看出,swapper 进程不是迭代的一部分。
我正在玩 Linux 内核,我不明白的一件事是 init_task
任务的 pid。
据我所知,有两个特殊的 pid:idle/swapper 任务的 pid 0 和 init 任务的 pid 1。
我能找到的每个在线资源(例如 one, two)都说 init_task
任务代表交换器任务,即它应该有 pid 0。
但是当我使用从 init_task
开始的 for_each_process
宏打印所有 pid 时,我得到 pid 1 作为第一个进程。我根本没有得到 pid 0。这意味着 init_task
的 pid 为 1,并且它是初始化任务 (?!)。
请帮我解决这个困惑。
P.S。内核版本是 2.4.
让我感到困惑的原因是 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;
}
可以看出,swapper 进程不是迭代的一部分。