所有的list函数见 include/linux/list.h

自己从 include/linux/list.h 拷贝了一些函数到自己的list.c中, 然后练习了一下。

没有别的目的,就是想熟练一下。毕竟linux内核代码中试用了大量的list函数。

list的函数太方便使用了。

文件:list.c

 #include <stdio.h>
// #include <linux/list.h> struct list_head {
struct list_head *next, *prev;
}; #define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name) static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
} static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next) //ËüÖ»Êǽ«newÌí¼Óµ½prevºÍnextÖ®¼ä
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
} static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
} static inline int list_empty(const struct list_head *head)
{
return head->next == head;
} #undef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) /**
* * container_of - cast a member of a structure out to the containing structure
* * @ptr: the pointer to the member.
* * @type: the type of the container struct this is embedded in.
* * @member: the name of the member within the struct.
* *
* */
#define container_of(ptr, type, member) ({ \
const typeof( ((type *))->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );}) #define list_entry(ptr, type, member) \
container_of(ptr, type, member) /**
* * list_for_each_entry - iterate over list of given type
* * @pos: the type * to use as a loop cursor.
* * @head: the head for your list.
* * @member: the name of the list_struct within the struct.
* */
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) #define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next) struct devlist {
struct list_head list;
char * name;
}; struct devlist dev0 = {
.list = LIST_HEAD_INIT(dev0.list),
.name = NULL,
}; /* static initiate head list*/
// LIST_HEAD(hl);
struct list_head hl = LIST_HEAD_INIT(hl); void main(void) {
/* dynamic initiate head list. */
INIT_LIST_HEAD(&hl);
struct list_head *l;
struct devlist * pdev = NULL;
int empty = list_empty(&hl);
if(empty)
printf("the device list is empty!\n");
struct devlist dev1;
dev1.name = "device1";
list_add_tail(&dev1.list, &hl);
struct devlist edev1 = {{}, "entry device1"};
list_add_tail(&edev1.list, &dev0.list);
struct devlist dev2 = {{}, "device2"};
list_add_tail(&dev2.list, &hl);
struct devlist edev2 = {{}, "entry device2"};
list_add_tail(&edev2.list, &dev0.list); empty = list_empty(&hl);
if(!empty)
printf("the device list is not empty!\n"); list_for_each_entry(pdev, &dev0.list, list){
printf("the device name is %s\n", pdev->name);
} list_for_each(l, &hl) {
// for (l = (&hl)->next; l != (&hl); l = l->next){
// printf("l is: %p, head is: %p \n", l, &hl);
pdev = list_entry(l, typeof(dev0), list);
printf("the device name is %s\n", pdev->name);
}
}

输出结果:

 $ ./list
the device list is empty!
the device list is not empty!
the device name is entry device1
the device name is entry device2
the device name is device1
the device name is device2

练习一下linux中的list函数。的更多相关文章

  1. 深入解析Linux中的fork函数

    1.定义 #include <unistd.h> #include<sys/types.h> pid_t fork( void ); pid_t 是一个宏定义,其实质是int, ...

  2. 如何测试Linux 中的wait函数能不能等待子进程的子进程?

    #include <stdio.h> #include <stdlib.h> int main() { pid_t pid = fork(); switch(pid) { : ...

  3. [fork]Linux中的fork函数详解

    ---------------------------------------------------------------------------------------------------- ...

  4. 关于linux中的system函数

    Linux下使用system()函数一定要谨慎 https://blog.csdn.net/senen_wakk/article/details/51496322 system()正确应用 https ...

  5. Linux中的入口函数main

    main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...

  6. Linux中的读函数与块高速缓存

    为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时 ...

  7. Unix/Linux中的fork函数

    fork函数介绍 一个现有进程可以调用fork函数创建一个新进程.该函数定义如下: #include <unistd.h> pid_t fork(void); // 返回:若成功则在子进程 ...

  8. linux中内核延时函数 (转)

    第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...

  9. linux中字符串转换函数 simple_strtoul【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...

随机推荐

  1. ctype.h 字符分类与转换

      函数及说明 1 int isalnum(int c)该函数检查传递的字符是否是字母数字. 2 int isalpha(int c)该函数是否传递的字符是字母. 3 int iscntrl(int ...

  2. 正确决解Hibernate4.*中:Connection cannot be null when 'hibernate.dialect' not set

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  3. jQuery事件对象的属性

    注:摘自<锋利的jQuery(第二版)> JQuery在遵循W3C规范的情况下,对事件对象的常用属性进行了封装,使得事件处理在各大浏览器下都可以正常运行而不需要进行浏览器类型判断. 1. ...

  4. Oracle EBS-SQL (PO-3):检查期间手工下达的采购订单记录数.sql

    SELECT DECODE(pda.req_distribution_id,'','手工','自动创建') 下达方式, --pda.req_distribution_id                ...

  5. mvn 一些操作

    拷贝依赖包 mvn dependency:copy-dependencies -DoutputDirectory=src/main/webapp/WEB-INF/lib  -DincludeScope ...

  6. 2014第13周四Webservice概念问题记

    晚上回来看网页学习了这两天一直疑惑的两个问题: 1.REST和SOAP架构下的Webservice的区别? 2.axis2和CXF的区别. 大部分是理论,暂时摘录一下,以后有更多实践后再回顾. 一.R ...

  7. CentOS Linux 中文输入法安装及设置

    安装: 1.需要root权限,所以要用root登录 ,或su root 2.yum install "@Chinese Support" 3.exit 4.回到桌面,system- ...

  8. html和js

    1.<input type="button" value="Hello world!"> 2.<button type="butto ...

  9. php-GD库的函数(一)

    <?php //getimagesize - 取得图片的大小[即长与宽] //print_r(getimagesize("./logo_i.gif")); //Array ( ...

  10. Android UI ActionBar功能-自定义 Action Bar 样式

    ActionBar的样式官方提供了三种: Theme.Holo Theme.Holo.Light Theme.Holo.Light.DarkActionBar 但不仅仅是这三种,我们还可以自己定义Ac ...