#include
struct student {
char name[100]; int num;
struct list_head list; };
//以上是定义包含有的struct list_head 结构的数据结构
struct student *pstudent;//定义一个结构数组,用来存放数据,注意这里pstudent是数组指针,数组的大小由后面的kmalloc来分配!
struct student *tmp_student;//遍历时临时用来存放指向pstudent[i]的指针 struct list_head student_list;//定义链表头(是一个节点)
struct list_head *pos;//指向头结点的一个指针,会在list_for_each中说明
int mylist_init(void) {
int i = 0;
INIT_LIST_HEAD(&student_list);//初始化链表头,注意参数是一个指针,用了&符号 pstudent = kmalloc(sizeof(struct student)*5,GFP_KERNEL);//为结构体数组分配空间,共有5个数组成员
memset(pstudent,0,sizeof(struct student)*5);//初始化结构体数组 for(i=0;i<5;i++)//建立链表 {
sprintf(pstudent[i].name,\初始化并显示学生姓名 pstudent[i].num = i+1; //初始化学生号码
list_add( &(pstudent[i].list), &student_list);//将pstudent[i].list节点插入到student_list链表中,注意这里是从头结点处插入的,最后顺序为 5、4、3、2、1 }
list_for_each(pos,&student_list)//遍历链表,此函数指明pos是一个指向节点头的指针,前面已经定义了它的类型。遍历函数相当于一个for循环,{ }内为循环操作,没循环一次pos=&student_list+1! {
tmp_student = list_entry(pos,struct student,list);//list_entry(提取数据结构)指针pos指向结构体struct student中的成员list,返回值为指向list所在的结构体的指针(起始地址) printk(\}//输出此结构体(结构数组其中的一个成员)的数据信息 return 0; }
void mylist_exit(void)//删除节点 { int i ;
for(i=0;i<5;i++) {
list_del(&(pstudent[i].list) ); }
kfree(pstudent);//释放分配的内存 }
module_init(mylist_init);//内核模块模式固定的部分 module_exit(mylist_exit);//内核模块模式固定的部分
三、Linux内核通用哈希链表
1、内核通用哈希链表的定义 2、怎样创建哈希链表 3、怎样向哈希链表添加节点 4、怎样查找哈希链表 5、怎样删除哈希链表节点
6、怎样全部输出哈希链表的所有节点
1、内核通用哈希链表的定义 struct hlist_head
{ struct hlist_node *first; };
struct hlist_node
{ struct hlist_node *next, **pprev; };
2、怎样创建哈希链表
创建具有16个元素的哈希链表的方法如下:struct hlist_head user_hash[16]; 3、怎样给哈希链表添加节点
(1)在指定的哈希链表头h所指向的链表头插入新节点
// @n:要添加的新哈希链表节点 // @h:在此哈希链表头节点后添加 hlist_add_head(struct hlist_node *n, struct hlist_head *h);
4、怎样查找哈希链表
(2)根据当前哈希链表节点指针ptr获得哈希链表宿主节点指针
// @ptr:struct hlist_node类型的指针 // @type:哈希链表节点所在的宿主节点的类型 // @member:嵌入宿主的哈希链表节点的变量名 hlist_entry(ptr, type, member); 5、怎样删除哈希链表节点
(3)从链表中删除一个指定节点// @entry:要从链表中删除的节点 hlist_del(struct hlist_head *entry); 6、怎样全部输出哈希链表的所有节点
(4)遍历哈希链表中某个key值所对应的链表
// @tpos:哈希链表宿主节点指针 // @pos:哈希链表节点指针 // @head:哈希链表中某key所对应的链表的头指针 // @member:嵌在哈希链表宿主节点中的哈希链表节点的变量名 hlist_for_each_entry(tpos, pos, head, member);
四、IP协议首部C语言定义
首部各个字段的含义(参考教材P113-114)
首都长度:IP首部的长度,一般为20B.版本:IP地址的版本,目前我们使用的都是第4版,所以这种IP也经常称为IPV4.
服务类型:服务类型包括一个3bit的优先权字段(现已被忽略),4bitTOS字段和1位未用位但必须置为0。4位的TOS分别代表最小延迟、最大吞吐量、最高可靠性和最小费用。对于TOS值,不同应用有不同的最佳值。具体值可参考RFC1394文档:http://www.rfc-editor.org/pdfrfc/rfc1349.txt.pdf
总长度:数据包的总长度。该字段是IP首部的必要内容,因为链路层需要填充一些数据以达到最小长度。(PS:以太网的最小帧长为46B).
标识符:唯一标识主机发送的每一份数据报。
标志:分为3个字段,依次为保留位、不分片位和更多片位。 ● 保留位:一般被置为0;