进程间通信系列(9)消息队列的创建、打开、控制

消息队列的特性:

1.消息队列是内核中的链表;

2.用户将数据传送给内核后,内核重新添加一些如用户ID、组ID、读写进程的ID和优先级等

  相关信息后并打成一个数据包称为消息;

3.允许一个或者多个进程往消息队列中写消息和读消息,但一个消息只能被一个进程读取,

  读取完毕后就自动删除;

4.消息队列具有一定的FIFO特性,消息可以按照顺序发送到队列中,也可以几种不同的方式

  从队列中读取。每一个消息队列在内核中用一个唯一的IPC标识ID表示;

5.消息队列的实现包括创建和打开队列、发送消息、读取消息和控制消息队列四种操作。

消息队列属性结构体
struct msqid_ds {
	struct ipc_perm msg_perm;         /* Ownership and permissions*/
	unsigned long  __msg_cbytes;      /* Current number of bytes in  queue (non-standard) */
	msgqnum_t      msg_qnum;          /* Current number of messages  in queue */
	msglen_t       msg_qbytes;        /* Maximum number of bytesallowed in queue */
	pid_t          msg_lspid;         /* PID of last msgsnd() */
	pid_t          msg_lrpid;         /* PID of last msgrcv() */
	time_t         msg_stime;         /* Time of last msgsnd() */
	time_t         msg_rtime;         /* Time of last msgrcv() */
	time_t         msg_ctime;         /* Time of last change */
};

创建和打开消息队列
#include <sys/msg.h>

int msgget(key_t key, int flag);

返回:成功返回内核中消息队列的标识符ID,出错返回-1

参数:

key:用户指定的消息队列键值

flag:IPC_CREAT, IPC_EXCL等权限组合

若创建消息队列,key可指定键值,也可将之设置为IPC_PRIVATE。若打开进行查询,则key
不能为0,必须是一个非零的值,否则查询不到。

消息队列控制

#include <sys/msg.h>

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

返回:成功返回0,出错-1


参数:

msgid:消息队列ID

buf:消息队列属性指针
cmd:

IPC_STAT 获取消息队列的属性,取此队列的msqid_ds结构,并将其存放在buf指向的结构中;

IPC_SET 设置属性,按由buf指向的结构中的值,设置与此队列相关的结构中的字段;

IPC_RMID 删除队列,从系统中删除该消息队列以及仍在该队列上的所有数据;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

洪流之源

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

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

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

打赏作者

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

抵扣说明:

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

余额充值