进程通信——消息队列

查看消息队列:ipcs -q

删除消息队列:ipcrm -q 消息队列ID

特点:通信双方可以通过消息类型选择性的接收消息

创建消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);

返回:成功 消息队列的ID 失败 -1

参数:
key:函数ftok的返回值或IPC_PRIVATE,也可以随便放数字。
msgflag:IPC_CREAT:创建新的消息队列。
IPC_EXCL:与IPC_CREAT一同使用(用 ‘|’ 连接),表示如果要创建的消息队列已经存在,则返回错误。
IPC_NOWAIT:读写消息队列要求无法满足时,不阻塞。
**注意:**使用或设置消息队列文件权限

消息发送

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

返回:成功 0 失败 -1

参数:
msqid:消息队列的ID
msgp:发送的结构体指针
msgsz:发送的大小
msgflg:标志位,一般是0

发送的信息需要打包成结构体,必须有如下两个成员:

struct msgbuf {
               long mtype;       // 消息的类型,别设置成0!!!!!
               char mtext[10];    // 真实消息内容
           };

消息接收

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

返回:成功 接收的字节数 失败 -1

参数:
msqid:消息队列的ID
msgp:接收保存消息的结构体指针(同上面消息发送的结构体
msgsz:接收的大小
msgtype(重点):接收消息的类型,结构体内的long数据
msgflg:标志位,可以是0(忽略)。
IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。如果不 指定这个参数,那么进程将被阻塞直到函数可以从队列中得到符合条件的消息为止。
MSG_NOERROR,如果函数取得的消息长度大于msgsz,将只返回msgsz 长度的信息,剩下的部分被 丢弃了。如果不指定这个参数,E2BIG 错误将被返回,而消息则留在队列中不被取出。

如果接收消息类型不存在,就会造成程序阻塞
如果同一个类型有多个消息,接收按照发送顺序接收

删除消息队列

其实它不是完全用于删除,操作与输入参数cmd有关

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

返回:成功0 失败 -1

参数:
msqid:消息队列ID
cmd:IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在 buf 指定的地址中。
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID:从系统内核中移走消息队列。
buf:存放读取/设置 消息队列属性 的结构体,如果是删除/移走 可以是null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值