main.c:
#include <stdio.h>
#include "list.h"
typedef struct file{
int a;
int b;
struct list_head list;
}FILEX,*PFILEX;
int main()
{
FILEX file_a;
FILEX file_b;
FILEX file_c;
FILEX *file_tmp;
file_a.a = 10;
file_a.b = 11;
file_b.a = 20;
file_b.b = 22;
file_c.a = 30;
file_c.b = 33;
LIST_HEAD(head);
list_add(&(file_a.list),&head);
list_add(&(file_b.list), &(file_a.list));
list_add(&file_c.list, &file_b.list);
list_for_each_entry(file_tmp, &head, list)
{
printf("%d\n",file_tmp->a);
}
printf("*******************\n");
list_del(&file_b.list);
list_for_each_entry(file_tmp, &head, list)
{
printf("%d\n",file_tmp->a);
}
list_del(&file_a.list);
list_del(&file_c.list);
if (list_empty(&head))
{
printf("list is empty!!!\n");
}
else
{
printf("list is not empty!!!\n");
}
printf("hello world!!!\n");
return 0;
}
list.h ==>来自linux内核
#ifndef _LINUX_LIST_H
#define _LINUX_LIST_H
#define LIST_POISON1 ((void *) 0x00100100)
#define LIST_POISON2 ((void *) 0x00200200)
//typedef unsigned int size_t;
static inline void prefetch(const void *x) {;}
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
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)
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
/**
* 把元素插入特定元素之后
*/
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}
/**
* 删除特定元素
*/
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
/**
* 检查指定的链表是否为空
*/
static inline int list_empty(const struct list_head *head)
{
return head->next == head;
}
/**
* 返回链表所在结构
*/
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
/**
* 扫描指定的链表
*/
#define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = pos->next)
/**
* 与list_for_each相似,但是返回每个链表结点所在结构
*/
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
#endif
main.c的输出
[root@localhost test]# gcc main.c
[root@localhost test]# ./a.out
10
20
30
*******************
10
30
list is empty!!!
hello world!!!
[root@localhost test]#
可以将上面的内容用于生产与消费者,加上malloc,free。动态生产与消费。