gpt4 book ai didi

linux - 关于 init_task 的混淆(pid 0 或 pid 1?)

转载 作者:可可西里 更新时间:2023-11-01 11:48:51 25 4
gpt4 key购买 nike

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

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

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

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

请帮我解决这个困惑。

附言内核版本为 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 0 或 pid 1?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33583323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com