16 消息队列1
2017-01-22 20:41
106 查看
1. 管道、队列 与IPC的消息队列有什么区别呢?
消息队列是链式的,消息的类型可以不一致。
消息队列中维护队列的结构体msqid_ds,其中的第一个消息指针msg_first,最后一个指针msg_last..
每个消息中包含数据data,数据的长度length,数据的类型type。
2. 消息队列创建函数msgget
创建了消息队列后可以通过system("ipcs -q");查看队列信息
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数原型:
int msgget(key_t key, int flag);
参数:
key,和消息队列关联的key值
flag,消息队列的访问权限
返回:
成功,消息队列ID
出错:-1
3. 发送消息队列msgsnd
函数原型:
int msgsnd(int msqid, const void *msgp, size_t size, int flag)
参数:
msqid,消息队列ID
msgp,指向消息的指针
常用消息结构msgbuf如下:
struct msgbuf{
long mtype;
//消息类型
car mtext
;
//消息正文
}
size,发送的消息正文字节数
flag,IPC_NOWAIT,消息没有发送完函数也会立即返回
0,直到发送完函数才返回
返回:
成功0
出错-1
4. 接收消息函数msgrcv
函数原型:
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)
参数:
msgid,消息队列号
msgp,接收消息的缓冲区
size,要接收的消息字节数
msgtype,0:接收消息队列中第一个消息
>0,接收消息队列中第一个类型为msgtype的消息
<0,接收消息队列中类型值不大于msgtype的绝对值切类型值又最小的消息
flag,0:若无消息函数一直阻塞
IPC_NOWAIT,若没消息,进程立即返回ENOMSG
返回:
成功,接收到的消息长度
出错-1
5. 消息队列控制函数msgctl
原型:
int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)
参数:
msgid,消息队列ID
cmd,IPC_STAT,读取消息队列的属性,并将其保存在buf指向的缓冲区
IPC_SET,设置消息队列属性,这个值取自buf参数
IPC_RMID,从系统中删除消息队列
buf,消息队列缓冲区
返回:
成功0,,出错-1
6. 实例
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int msgid;
msgid=msgget(IPC_PRIVATE,0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
//delete message queue
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-virtual-machine:/extra/process/sixteen$ ./a.out
creat message queue sucess msgid=0
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 0 alex 777 0 0
------ Message Queues --------
key msqid owner perms used-bytes messages
alex@alex-virtual-machine:/extra/process/sixteen$
消息队列是链式的,消息的类型可以不一致。
消息队列中维护队列的结构体msqid_ds,其中的第一个消息指针msg_first,最后一个指针msg_last..
每个消息中包含数据data,数据的长度length,数据的类型type。
2. 消息队列创建函数msgget
创建了消息队列后可以通过system("ipcs -q");查看队列信息
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数原型:
int msgget(key_t key, int flag);
参数:
key,和消息队列关联的key值
flag,消息队列的访问权限
返回:
成功,消息队列ID
出错:-1
3. 发送消息队列msgsnd
函数原型:
int msgsnd(int msqid, const void *msgp, size_t size, int flag)
参数:
msqid,消息队列ID
msgp,指向消息的指针
常用消息结构msgbuf如下:
struct msgbuf{
long mtype;
//消息类型
car mtext
;
//消息正文
}
size,发送的消息正文字节数
flag,IPC_NOWAIT,消息没有发送完函数也会立即返回
0,直到发送完函数才返回
返回:
成功0
出错-1
4. 接收消息函数msgrcv
函数原型:
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)
参数:
msgid,消息队列号
msgp,接收消息的缓冲区
size,要接收的消息字节数
msgtype,0:接收消息队列中第一个消息
>0,接收消息队列中第一个类型为msgtype的消息
<0,接收消息队列中类型值不大于msgtype的绝对值切类型值又最小的消息
flag,0:若无消息函数一直阻塞
IPC_NOWAIT,若没消息,进程立即返回ENOMSG
返回:
成功,接收到的消息长度
出错-1
5. 消息队列控制函数msgctl
原型:
int msgctl(int msgqid, int cmd, struct msgqid_ds *buf)
参数:
msgid,消息队列ID
cmd,IPC_STAT,读取消息队列的属性,并将其保存在buf指向的缓冲区
IPC_SET,设置消息队列属性,这个值取自buf参数
IPC_RMID,从系统中删除消息队列
buf,消息队列缓冲区
返回:
成功0,,出错-1
6. 实例
#include "sys/types.h"
#include "sys/msg.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
int main()
{
int msgid;
msgid=msgget(IPC_PRIVATE,0777);
if(msgid <0)
{
printf("creat message queue failure\n");
return -1;
}
printf("creat message queue sucess msgid=%d\n",msgid);
system("ipcs -q");
//delete message queue
msgctl(msgid,IPC_RMID,NULL);
system("ipcs -q");
return 0;
}
执行结果:
alex@alex-virtual-machine:/extra/process/sixteen$ ./a.out
creat message queue sucess msgid=0
------ Message Queues --------
key msqid owner perms used-bytes messages
0x00000000 0 alex 777 0 0
------ Message Queues --------
key msqid owner perms used-bytes messages
alex@alex-virtual-machine:/extra/process/sixteen$
相关文章推荐
- 化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)
- 化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)
- 化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)
- 化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)
- 流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16
- 消息队列选型[首选Kafka](备选:RabbitMQ/NSQ/RocketMQ/disque/Kafka)
- 消息和消息队列(Using Messages and Message Queues)
- 进程间通信之消息队列
- ipcs命令详解——共享内存、消息队列、信号量定位利器
- jedis实现redis的消息队列、发布对象消息、字节数组与字符串相互转换
- RabbitMQ消息队列(二):"Hello, World"[转]
- 【消息队列MQ】各类MQ比较
- 基于NIO的消息路由的实现(六)报文队列的处理
- POSIX消息队列
- 消息队列ipc的一些设置
- 安装 RabbitMQ 消息队列
- 基于Redis实现分布式消息队列(3)
- Qt使用 消息队列框架 RabbitMQ
- 基于Redis实现分布式消息队列(4)
- Linux进程间通信——使用消息队列