我正在玩Linux内核,有一点我不明白的是init_task任务的pid .
据我所知,有两个特殊的pid:空闲/交换任务的pid 0和init任务的pid 1.
我能找到的每个在线资源(例如一个,两个)都说该init_task任务代表交换器任务,即它应该有pid 0.
但是当我使用从头for_each_process开始的宏打印所有init_taskpid 时,我得到pid 1作为第一个进程.我根本没有得到pid 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 ; )
Run Code Online (Sandbox Code Playgroud)
即使它似乎p从init_task它开始,它实际上是从init_task.next_task因为条件中的赋值开始的.
所以for_each_task(p) { /* ... */ }可以改写为:
p = init_task.next_task;
while(p != &init_task)
{
/* ... */
p = p->next_task;
}
Run Code Online (Sandbox Code Playgroud)
可以看出,交换器进程不是迭代的一部分.
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |