linux下消息队列(Message queue)

1.消息队列
消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式。
就是一个消息的链表,可以把一条消息看做一个记录,用户可以从中读取读取消息或者向其中添加消息。
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。消息队列存在于内核中,由“队列ID”来进行标识。
消息队列的实现包括创建,添加信息,读取信息和控制信息队列。
2.msgget函数
该函数作用是创建和访问一个消息队列:
#include <sys/types.h>
#inlcude <sys/types.h>
#include <sys/msg.h>
int msgget(key_t key,int msgflag);
key键值,用来命名某个特定的消息队列。同样和信号量和信号一样,IPC_PRIVATE值可以创建只有当前进程可以访问的消息队列。
msgflag由9个权限标志组成。
若成功,则msgget函数返回一个正整数,即队列标示符。
3.msgsnd函数
msgsnd函数用来把消息添加到消息队列中:
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
消息的结构受到两个方面的约束:首先他的长度必须小于系统规定的上限;其次,它必须是以一个长整形成员变量开始,接收函数用这个成员变量来确定消息的类型。使用消息时应该定义成:
struct my_message
{
long int message_type;
/*需要传输的数据*/
}
参数msqid是megget函数的返回的消息队列的标识符。
msgp是一个指向准备发送的消息的指针。
msgsz是消息的长度,这个长度不包括消息类型成员变量。
msgflag控制在当前消息队列满或者达到系统范围限制时要发生的事情。
如果msgflg中设置IPC_NOWAIT标志,函数将立刻返回,不发送消息并且返回值-1.
若设定的啊标识是0,则msgsnd函数会一直阻塞直到发送成功为止。
函数执行成功返回0,失败返回-1.
4.msgrcv函数:
msgrcv函数从一个消息队列中获取消息:
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,inr msgflg);
msqid是由msgget函数返回的消息队列标识符。
msgp是一个指向准备接受的消息的指针。
msgsz是消息的长度。
msgtyp可以实现一种简单形式的接收优先级。
(1) 当msgtyp=0,就获取消息队列中的第一个可用的消息。
(2)如果值大于0,就获取具有与msgtyp相同消息类型的第一个消息
(3)如果值小于0,就获得消息队列中第一个小于或等于msgtyp且绝对值类型值最小的消息
msgflg用于控制当队列中没有相应的类型的消息可接收时,将发生的事。
(1)MSG_NOERROR:当返回的消息比要获得的长度长,就会截断
(2)IPC_NOWAIT:若在消息队列中已经没有相应的类型可以被接收,则函数会立即返回。
(3)0:msgsnd函数阻塞直到接收到消息
若msgrcv函数执行成功,返回放到接收缓冲区中的字节数,消息被复制到由msgp指向的用户分配的缓冲区,然后删除消息队列中对应的消息。
5.msgctl函数
msgctl与共享内存的控制函数类似:
int msgctl(int msqid ,int cmd,struct msqid_ds *buf);
cmd可用取三个值:
(1)IPC_STAT:读取消息队列的数据结构msqid_ds,存储在buf指定的区域
(2)IPC_SET:如果进程有足够的权限,就把消息队列的当前关联值设置为msqid_ds结构中给出的值。
(3)IPC_RMID:删除消息队列
注意:当删除消息队列时,某个进程正在msgsnd或msgrcv函数中等待,则这两个函数都将会失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值