我正在玩Linux内核,有一件事我不明白是init_task
任务的PID。
据我所知,有两个特殊的pid:idle / swapper任务的pid 0,init任务的pid 1。
每个在线资源(例如一个 , 两个 )我都可以find, init_task
任务代表了交换任务,即它应该有pid 0。
但是当我使用从init_task
开始的for_each_process
macros打印所有的pid时,我得到pid 1作为第一个进程。 我根本没有得到0。 这意味着init_task
具有pid 1,并且它是init任务(?!)。
请帮我解决这个困惑。
PS内核版本是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; }
可以看出,交换器进程不是迭代的一部分。