消息队列是消息的链接表,存放在内核中并由消息队列标识符标识
每条消息由3部分组成:消息类型+消息长度+实际数据
每条新消息总是放在队列尾部
用于描述消息队列的结构体为struct msqid_ds
打开一个现存队列或创建一个新队列
int msgget(key_t key, int flag)
成功返回消息队列ID,出错返回-1
操作消息队列
int msgctl(int msqid, int cmd, struct msgid_ds *buf)
成功返回0,出错返回-1
- 参数cmd说明对由msqid指定的队列要执行的命令,命令类型如下:
- IPC_STAT 取此队列的msqid_ds结构,存放至buf
- IPC_SET 根据buf中的值,设置此队列的msqid_ds
- IPC_RMID 从系统中删除此消息队列以及仍在队列中的数据
将数据放到消息队列中
int msgsnd(int msqid, const void *ptr,
size_t nbytes, int flag)
成功返回0,出错返回-1
- 参数ptr指向有消息类型和实际数据组成的结构体
- 参数nbytes代表消息长度
- 参数flag可以指定为IPC_NOWAIT,这使得当消息队列满或队列中的数
据总量超过系统限制时msgsnd立即出错返回EAGAIN,若未指定则会
阻塞
从消息队列中取消息
ssize_t msgrcv(int msqid, void *ptr, size_t nbytes,
long type, int flag)
成功返回消息的数据部分的长度,出错返回-1
-
参数ptr指向存放取出消息的缓存区
-
参数nbytes说明缓存区的大小,若返回消息大于nbytes,而且在flag中
设置了MSG_NOERROR,则该消息会别截短且不通知我们消息被
截短了,截去的部分会被丢弃 -
参数type指名想要哪一种消息
- type == 0 返回队列中的第一个消息
- type > 0 返回队列中类型为type的第一个消息
- type < 0 返回队列中消息类型值小于或等于type绝对值的消息
如果这种消息有若干个,则返回消息类型值最小的
-
参数flag值为IPC_NOWAIT,可以使操作不阻塞
网友评论