工作的主要内容是tcp/ip,平台是FreeBSD,而且在内核态开发,所以很多情况下会涉及内核的一些数据结构和宏,比如说mbuf和TAILQ等。 TAILQ是FreeBSD/linux内核对双向队列操作的一种抽象,抽象程度不亚于C++,能实现操作队列需要的各种操作:插入元素,删除元素,遍历队列等。这个队列的优点是插入元素很快。 这里先回顾一下队列的特点(来自维基百科
http://zh.wikipedia.org/wiki/%E9%98%9F%E5%88%97
):
1.描述前一个和下一个元素的结构体
队列,又稱為佇列(英文queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。FreeBSD中的TAILQ把整个队列头抽象为一个单独的数据结构,我们先看看FreeBSD中的TAILQ相关宏,然后再举例子理解这些宏。 这里用最简单的一个结构体来理解TAILQ,这个结构体中有一个int型整数,还有两个分别指向前方和后方的指针。
1.描述前一个和下一个元素的结构体
458 #define TAILQ_ENTRY(type) \ 459 struct { \ 460 struct type *tqe_next; /* next element */ \ 461 struct type **tqe_prev; /* address of previous next element */ \ 462 TRACEBUF \ 463 }这是TAILQ对两个指向前后两个元素指针的抽象,抽象为TAILQ_ENTRY结构体:tqe_next是指向下一个元素的指针, tqe_prev是一个二级指针,指针变量的地址,是前一个元素的tqe_next的地址,解引用(*tqe_prev)之后就是本元素的内存地址 ;TRACEBUF是一个调试相关的宏,我们先不管它。举例: 我们声明一个结构体,这个结构体只有一个int型整数,还有前驱和后继指针。
struct int_node{ int num; TAILQ_ENTRY(int_node); };宏展开之后就变成:
struct int_node{ int num; struct { struct int_node *tqe_next; /* next element */ sturct int_node **tqe_prev; /* address of previous next element */ }; };例如:
![](https://i-blog.csdnimg.cn/blog_migrate/a20ea3f32a3d9e2c2956fd91541d8461.gif)