定义:消息队列提供了一种从一个进程向另一个进程发送一个有类型数据块的方法。
1. 创建新消息队列或取得已存在消息队列
原型:int msgget(key_t key, int msgflg);
参数:key:可以认为是一个端口号,也可以由函数 ftok 生成。
msgflg: IPC_CREAT:如果 IPC 不存在,则创建一个 IPC 资源,否则打开操作。
IPC_EXCL:只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。
如果单独使用 IPC_CREAT,XXXget() 函数要么返回一个已经存在的共享内存的操作符,要么返回一个新建的共享内存的标识符。
如果将 IPC_CREAT 和 IPC_EXCL 标志一起使用,XXXget() 将返回一个新建的 IPC 标识符;如果该 IPC 资源已存在,或者返回-1。
IPC_EXEL 标志本身并没有太大的意义,但是和 IPC_CREAT 标志一起使用可以用来保证所得的对象是新建的,而不是打开已有的对象。
2. 向队列读/写消息
原型:msgrcv 从队列中取用消息:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
msgsnd 将数据放到消息队列中:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数:msqid:消息队列的标识码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
struct msgstru{
long mtype; //大于0
char mtext[用户指定大小];
};
msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果 msgflg 和常数 IPC_NOWAIT 合用,则在 msgsnd() 执行时若是消息队列已满,则 msgsnd() 将不会阻塞,而会立即返回 -1,如果执行的是 msgrcv(),则在消息队列呈空时,不做等待马上返回 -1,并设定错误码为 ENOMSG。当 msgflg 为 0时,msgsnd() 及 msgrcv() 在队列呈满或呈空的情形时,采取阻塞等待的处理模式。
3. 设置消息队列属性
原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID
IPC_STAT :该命令用来获取消息队列对应的 msqid_ds 数据结构,并将其保存到 buf 指定的地址空间。
IPC_SET :该命令用来设置消息队列的属性,要设置的属性存储在 buf 中。
IPC_RMID :从内核中删除 msqid 标识的消息队列。
发送信息的程序的源文件 msgsend.c 的源代码为:
运行结果如下:
comm.c 的代码:
server.c 的代码:
client.c 的代码:
Makefile 的编写:
我们可以用命令查看和删除我们创建的消息队列,如下:
以上就是我关于消息队列的认识,希望对你有所帮助。