【武汉华嵌嵌入式培训中心】Linux进程间通信跟消息队列文档

Linux 进程间通信之消息队列 作者:武汉华嵌嵌入式培训中心 技术部 在 linux 下有两种消息队列,一种是 POSIX 的消息队列,另外一种是 System V 消息队列。在这里只讲 System V 队列的使用。System V 消息队列使用消息队列 标识符标识,在某个进程往一个队列中写入一个消息之前,不求另外某个进程正 在等待该队列上一个消息的到达。 对于系统中每个消息队列,内核维护一个定义在<sys/msg.h>头文件中的信息结 构。该结构如下: struct msqid_ds{ struct ipc_perm */ msg_perm; /* read_write perms: Section 3.3 struct msg queue */ *msg_first; /* ptr to first message on struct msg queue */ *msg_last; /* ptr to last message on msglen_t msg_cbytes; /* current # bytes on queue */ … … } 消息队列由内核进行维护,我们可以将内核中某个选定的消息队列画为一个消息 链表,如下图所示: 以下都是操作消息队列的 API 函数,在这里将对其一一讲解。 ? 创建一个消息队列。 #include <sys/msg.h> int msgget(key_t key, into flag); 该函数在执行正常返回时,返回的是一个整数标识符,其他三个函数就用它来指 代该队列。该标识符是基于指定的 key 产生的,而 key 即可以是 ftok 的返回值, 也可以是常值 IPC_PRIVATE。 oflag 可以是读写权限的值的组合,它还可以与 IPC_CREAT 或 IPC_CREAT|IPC_EXCL 按位或。 当创建一个新消息队列时,msqid_ds 结构的一些成员被初始化。 ? 往一个打开的消息队列上放置一个消息。 #include <sys/msg.h> int msgsnd(int msqid, const void *ptr, size_t length, int flag); 该函数的第一参数 msqid 是由 msgget 的返回值提供。Ptr 是一个结构指针, 该结构可以如下定义: struct my_msg{ long types; char text[MAX_LENGTH]; } 该结构中的 types 是这个消息的类型,text 这个数组就是发送的消息的正文 部份。msgsnd 的 length 参数以字节为单位指定待发送消息的长度。如果待 发送消息的结构如上定义,则 length 的取值是 sizeof(struct my_msg) – sizeof(long)。第四个参数 flag 即可以是 0,也可以是 IPC_NOWAIT。当 flag 是 0 时,使得 msgsnd 调用阻塞,如果是 IPC_NOWAIT,使得 msgsnd 调用非阻 塞。 ? 使用 msgrcv 函数从某个消息队列中读出一个消息。 #include <sys/msg.h> ssize_t smgrcv(int msqid, void *ptr, size_t length, long type, int flag); 其中 ptr 参数指定所接收消息的存放位置,和 msgsnd 一个,该指针指向紧挨 在真正的消息数据之前返回的长整数类型字段。Length 指定了由 ptr 指向的 缓冲区中数据部分的大小,这是该函数能返回的最大数据量,该长度不包含 消息类型占的字节数。type 指定希望从消息队列中读出什么类型的消息, type 以下的几种取值有不同的效果,如下: ⑴、type 为 0 时,则返回队列中的第一个消息,也就是最早的那个消息。 ⑵、type 为大于 0 时,则返回其类型值为 type 的第一个消息。 ⑶、type 为小于 0 时,则返回其类型值小于或等于 type 参数的绝对值的消 息中类型最小的第一个消息。flag 的可能取值同 msgsnd 一样,代表着同样 的意思。只不过 msgrcv 多了一个选择,那就是 MSG_NOERROR,如果设置了该 位,当所接收消息的真正数据部分大于 length 参数时,msgrcv 只截短数据 部分,面不返回错误。该函数成功返回时,msgrcv 返回的是所接收消息中数 据的字节数。它不包括消息类型所占有字节数。 ? 使用 msgctl 对消息队列进行控制。 #include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buff); 该函数提供了三个控制命令,分别如下: IPC_RMID 从系统中删除由 msqid 指定的消息队列,对于该命令, msgctl 第三个参 数被忽略。 IPC_SET 员。 给所指定的消息队列设置其 msqid_ds 结构的几个成 IPC_STAT 结构。 给调用者返回与所指定消息队列对应的当前 msqid_ds 总结: ? 消息队列是由内核维护的,也就是说消息队列是随内核持续性的。在进程 结束的时候,消息队列并消失,只有在显示的删除消息队列或者在内核自 检的时候,消息队列才会删除。 以下是使用消息队列例子: ? 发送进程: #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #define MAX_MSG_LENGTH 1024 //自己定义的消息格式 typedef struct msgbuf { long types; char texts[

相关文档

【武汉华嵌嵌入式培训中心】Linux进程间通信之信号量
【武汉华嵌嵌入式培训中心】Linux进程间通信之消息队列
linux进程间通信(中嵌教育-嵌入式linux开发课件)
【武汉华嵌】Linux进程间通信之共享内存
linux进程间通信消息队列
Linux基于消息队列实现进程间通信的程序
第4章_嵌入式Linux进程间通信
武汉 华嵌嵌入式Linux驱动开发班
武汉 华嵌嵌入式Linux应用开发班
武汉 华嵌嵌入式Linux就业班(全日制)
电脑版