我是靠谱客的博主 潇洒手套,最近开发中收集的这篇文章主要介绍list_for_each,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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, &current->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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部