Linux编程练习 --SystemV消息队列

来源:互联网 发布:知乎引用格式 编辑:程序博客网 时间:2024/06/06 09:24

 1.system V ipc
起源于system V IPC 系统,但现在大多数UNIX系统都支持该机制, 在SYSTEM V,AT&T中引入的IPC(交互进程控制的)机制的三种新方式(消息队列,信号灯和共享内存)。
2.IPC 标识符 和IPC关键字
IPC对象:单独的消息队列、信号量、共享内存
IPC关键字:获得唯一的标识符,则必须使用一个IPC关键字,可以用ftok函数产生关键字

#include <sys/ipc.h>
key_t ftok(char* pathname,int id);
pathname:路径名  id:整数标识符

返回:成功返回IPC key

ipc_perm结构

 3.消息队列

 消息队列是系统内核地址空间中的一个内部的链表,消息可以按照顺序发送到队列中,也可以几种不同方式从队列中读取。每一个消息队列用唯一的IPC标识符表示。在应用时,要自己定义数据结构msgbuf消息缓冲区

/*消息缓冲区*/
struct message
{
 long msg_type;   //消息标识符
 char msg_text[BUFSZ]; //消息,这个字段不但可以存储字符,还可以存储其他类型数据
};

 

4.消息队列基本系统调用
A.创建
消息队列的系统调用语法:
#include<sys/msg.h>
int msgget(key_t key,int flags)
key 消息队列的键值,可以为IPC_PRIVATE,也可以用整数指定一个flags 消息队列权限位。
msgget 调用成功,如果key 用新整数指定,且flags 中设置了IPC_CREAT
位,则返回一个新建立的消息队列标识符。如果指定的整数key 已存在则返
回与key 关联的标识符。成功返回-1。
B.追加一条新消息到消息队列的系统调用语法:
#include <sys.msg.h>
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
msqid 由消息队列的标识符
msgp 消息缓冲区指针。消息缓冲区结构为:
struct msgbuf {
long mtype; /* 消息类型,必须大于0 */
char mtext[1]; /* 消息数据,长度应于msgsz 声明的一致*/

msgsz 消息数据的长度
msgflg 为0表示阻塞方式,设置IPC_NOWAIT 表示非阻塞方式
msgsnd 调用成功返回0,不成功返回-1。
C.从到消息队列中读出一条新消息的系统调用语法:
#include <sys.msg.h>
int msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtype, int msgflg);
msqid 由消息队列的标识符
msgp 消息缓冲区指针。消息缓冲区结构为:
struct msgbuf {
long mtype; /* 消息类型,必须大于0 */
char mtext[1]; /* 消息数据,长度应于msgsz 声明的一致*/

msgsz 消息数据的长度
msgtype 决定从队列中返回哪条消息:
=0 返回消息队列中第一条消息
>0 返回消息队列中等于mtype 类型的第一条消息。
<0 返回mtype<=type 绝对值最小值的第一条消息。
msgflg 为0表示阻塞方式,设置IPC_NOWAIT 表示非阻塞方式
msgrcv 调用成功返回0,不成功返回-1。

 

下面练习: