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