list_for_each
2015-01-30 14:32
323 查看
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(/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_entry/list_entry/container_of
- list_for_each_entry深入理解
- list_for_each 分析
- list_for_each_entry
- list_for_each_entry宏
- 详解Linux内核之双向循环链表(2) list_for_each/list_entry/list_for_each_entry
- 内核常见函数之list_for_each_entry/container_of
- list_for_each 详解
- Linux内核中list_for_each_entry浅析
- list_for_each_entry解析
- list_for_each()与list_for_each_safe()的区别
- list_for_each_entry
- linux内核——list_for_each_entry
- list_for_each_entry
- php数组的遍历讲解 for foreach list each key
- Linux内核中的list_for_each_entry
- List for each entry
- php数组的遍历讲解 for foreach list each key
- 【Linux】list_for_each()与list_for_each_safe()的区别
- 浅析遍历子进程方法(利用list_for_each)