Linux 内核 双链队列

Linux 内核 双链队列,第1张

双联就是双向的链表,每一个节点有一个void *prev和void *next。数据结构的书上都有。

双向链表的插入和删除 *** 作很快,如果是单向的,需要从头节点遍历。

prev和next还有一些变种,都是用来寻找前后的节点的。

首先建议你先参考 《advanced programming in the unix environment》 一书中的第15章(Interprocess communication 进程间通信)中的第7节(message queues 消息队列)了解消息队列的相关接口函数,比如如何创建获取消息队列,如何收发消息。然后就很简单了

如果你打算两个进程依次收消息,发消息,就像打乒乓球一样,那么只要一个queue,A 发消息, B 收消息并处理,然后 B 发消息, A 收并处理………… 按此次序进行下去。

更灵活的方法是两个消息队列 (a, b), A 进程从 队列a收消息,向 b 发消息。 B进程从b收消息,想a发消息。

消息队列是消息的链表,存放在内核中并有消息队列标示符标示。

msgget用于创建一个新队列或打开一个现存的队列。msgsnd将新消息加入到消息队列中;每个

消息包括一个long型的type;和消息缓存;msgrcv用于从队列中取出消息;取消息很智能,不一定先进先出

①msgget,创建一个新队列或打开一个现有队列

#include

int msgget ( key_t key, int flag );

//成功返回消息队列ID;错误返回-1

②msgsnd: 发送消息

#include

int msgsnd( int msgid, const void* ptr, size_t nbytes, int flag )

//成功返回0,错误返回-1

a:

flag可以指定为IPC_NOWAIT

若消息队列已满,则msgsnd立即出错返回EABAIN;

若没指定IPC_NOWAIT; msgsnd会阻塞,直到消息队列有空间为止

③msgrcv: 读取消息:

ssize_t msgrcv( int msgid, void* ptr, size_t nbytes, long type, int flag )

a. type == 0返回消息队列中第一个消息,先进先出

b. type >0

返回消息队列中类型为tpye的第一个消息

c. type <0

返回消息队列中类型 <=

|type| 的数据;若这种消息有若干个,则取类型值最小的消息

消息队列创建步骤:

#define

MSG_FILE "."

struct msgtype {

long mtype

char buffer[BUFFER+1]

}

if((key=ftok(MSG_FILE,'a'))==-1)

{

fprintf(stderr,"Creat Key Error:%s\n", strerror(errno))

exit

(1)

}

if((msgid=msgget(key, IPC_CREAT | 0666/*PERM*/))==-1)

{

fprintf(stderr,"Creat Message

Error:%s\n", strerror(errno))

exit

(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7294354.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-03
下一篇2023-04-03

发表评论

登录后才能评论

评论列表(0条)

    保存