由于本人水平有限,文章中难免会有错误,还望指正,不胜感激.
nginx双向链表特点:
1.其数据结构仅有两个指针 prev和next
2.不分配内存空间
3.操作简单,仅仅移动指针的前后指向
4.可以链接不同的数据,只要数据中包含queue这种数据成员
先来张图:
这里的哨兵指的是 :
ngx_queue_t
ngx_que
; //哨兵元素
ngx_queue_init
(&
ngx_que
); //构建双向链表
每次插入元素都会插入到黑框里,我们就是对黑框里的元素进行操作的(双向链表是不会分配空间的,仅仅操作指针).
//ngx_queue.h
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
//由于我们仅仅把queue拿出来单独做一个demo,
//没必要包含其他没有用的头文件,所以注释掉
//#include <ngx_config.h>
//#include <ngx_core.h>
#ifndef _NGX_QUEUE_H_INCLUDED_
#define _NGX_QUEUE_H_INCLUDED_
typedef struct ngx_queue_s ngx_queue_t ;
typedef int ngx_int_t;
typedef unsigned int u_char;
//自定义offsetof 即:偏移量
#define offsetof (struct_type,member_type) \
((( size_t ) &(((struct_type *)0)->member_type))/( sizeof( size_t )))
struct ngx_queue_s {
ngx_queue_t * prev ; //前向指针
ngx_queue_t * next ; //后项指针
};
/** 函数名: ngx_queue_init
* 功能描述: 初始化ngx_queue_t
* 参数列表: ngx_queue_t*型数据
* 返回值 :
*/
#define ngx_queue_init ( q)