概述
Linux系统中的每个进程都有一个父进程(init进程除外);每个进程还有0个或多个子进程。在进程描述符中parent指针指向其父进程,还有一个名为children的子进程链表(父进程task_struct中的children相当于链表的表头)。
而我们可以使用list_for_each(/include/linux/list.h)来依次遍历访问子进程:
struct task_struct *task;
struct list_head *list;
list_for_each(list, ¤t->children) {
task = list_entry(list, struct task_struct, sibling);
}
其中task即为某个子进程的地址
首先需要说明一点task_struct中的children指针指向其某个子进程的进程描述符task_struct中children的地址,而非直接指向某个子进程的地址,也就是说子进程链表中存放的仅仅是各个task_struct成员children的地址。
我们查看源文件找到list_for_each的定义:
#define list_for_each(pos, head)
for (pos = (head)->next; prefetch(pos->next), pos != (head);
pos = pos->next)
从上可以看出list_for_each其实就是一个for循环,在网上看到prefetch()是一个预抓取的函数,我并不理解它(哪位大牛知道的讲下哦),不过这个对for()并没有多大的影响。for()实现的就是一个children链表的遍历,而由children的地址如何取到task_struct的地址呢,它是由list_entry宏来实现的。
最后
以上就是潇洒手套为你收集整理的list_for_each的全部内容,希望文章能够帮你解决list_for_each所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复