进程间通信(IPC)——消息队列

消息队列(互发):

消息队列是消息的链接表,存放在内核中。
一个消息队列由一个标识符(队列ID)来标识。

消息队列API:

msgget(创建或打开消息队列

需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
参数原型:int msgget(key_t key, int msgflg);
key:消息队列的键值,通常通过ftok获取
例如:key_t key;
key = ftok(".",23);

msgflg:权限标志位
msgflg以下选择:
0:取消息队列标识符,若不存在则函数会报错
IPC_CREAT:当msgflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队列,返回此消息队列的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队列则报错
例如:int msgId = msgget(key,IPC_CREAT|0777);
返回值:成功返回队列ID
失败返回-1

msgsnd(添加消息)
需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
参数原型:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:消息队列标识符
msgp:发送给队列的消息。
msgp定义的参照格式如下:
struct msgbuf{
long mtype;
char mtext[128];
};

msgsz:消息正文的字节数(不包括消息类型指针变量)
msgglg:
0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列
IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回
例如:struct msgbuf sendBuf ={988,“Thank you for you”} ; msgsnd(msgId,&sendBuf,strlen(sendBuf.mtext),0);
返回值:成功返回0
失败返回-1

msgrcv(从消息队列读取消息)
需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
参数原型:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
msqid:消息队列标识符。
msgp:存放消息的结构体,结构体类型要与msgsnd函数发送的类型相同。
msgp定义的参照格式如下:
struct msgbuf{
long mtype;
char mtext[128];
};

msgsz:要接收消息的大小,不含消息类型占用的4个字节
msgtyp:
0:接收第一个消息
大于0:接收类型等于msgtyp的第一个消息
小于0:接收类型等于或者小于msgtyp绝对值的第一个消息
msgflg:
0: 阻塞式接收消息,没有该类型的消息msgrcv函数一直阻塞等待
例如:struct msgbuf readBuf;
msgrcv(msgId,&readBuf,sizeof(readBuf.mtext),888,0);

返回值:实际读取到的消息数据长度
失败返回-1

msgctl(获取和设置消息队列的属性)
需要的头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
参数原型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
msqid:消息队列标识符
cmd:
IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm域值。这个值取自buf函数。
IPC_RMID:从系统内核中删除消息队列。
buf:描述消息队列的msgqid_ds结构类型变量,一般为NULL。
把消息队列的链表从内核中删除:
例如:msgctl(msgId,IPC_RMID,NULL);
返回值:成功返回0
失败返回1

两端互发代码实现:

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值