【问题标题】:Confusion about init_task (pid 0 or pid 1?)关于 init_task 的困惑(pid 0 或 pid 1?)
【发布时间】:2023-04-02 22:29:01
【问题描述】:

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

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

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

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

请帮我解决这个困惑。

附:内核版本是2.4。

【问题讨论】:

  • 神圣著作:#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; )。你必须在某个地方看到init_task...是的,init_task交换者。

标签: linux kernel init


【解决方案1】:

让我感到困惑的原因是 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;
}

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

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2017-02-14
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多