IPC消息队列使用详细分析
2009-10-26 20:35
183 查看
虽然说是进程间通信中有关消息队列的一个比较详细的分析
同样的,共享内存,信号量和消息队列的公共部分知识也都同理
首先:使用XSI IPC需要首先了解标识符和键的概念
标识符是标识IPC对象的一个量,通常由一个int型变量表示,不过标识符只是IPC对象的内部名,如果要使的多个进程能够使用同一个IPC,需要得到一个外部名,这个外部名就是键--KEY,每个IPC对象都与一个键相关联
对于消息队列:可以通过函数magget通过一个键获得他的标识符,即通过外部标识得到内部标识的一个方法
例如:我们知道一个消息队列的键是msg_key;
那么:可以通过下列代码段
int msg_id;
nsg_id=msgget(msg_key,0666|IPC_CREAT|IPC_EXCL);
获取消息队列的ID。
得到了消息队列的ID后,我们就可以开始作很多行为了
如果你想要改变消息队列的一些属性,可以使用函数msgctl
如果想从消息队列中发送消息或获取消息,可以使用这两个函数
msgsnd,msgrcv
下面详细讲解一下msgsnd
这个函数的原型是:
int msgsnd(int msgid,const void *ptr,size_t nbytes,int flags);
第一个参数是消息队列的ID
第二个参数是要发送给消息队列的正长整形类型字段 稍后解释这个参数
第三个参数是要发送的实际数据字节(对应于长度)
第四个参数是设置符
如果我们想发送一段数据,我们可以这样做:
首先,建立一个这样的结构体
struct mymsg
{
long mtype; //这就是第二个参数所说的正长整形类型字段,表示发送信息的类型
char mtext[SIZE]; //size 可以自定,跟第三个参数有关
};
下面是向消息队列发送一段数据的代码段
struct mymsg
{
long type;
char mtext[10];
} msg;
msg.type=1;
strcpy(msg.mtext,"hello");
if(msgsnd(msg_id,&msg,10,IPC_NOWAIT)==-1)
fatal("msgsnd");
printf("send sucess!/n");
exit(0);
值得注意的是,第三个参数是结构体中第二个成员的大小,而不是整个结构体的大小
下面是《unix环境高级编程》中第15章中习题5.12 刚写的 发出来吧,希望对大家能够有所帮助,如果
有朋友也在看这本书的话,很希望多多交流~~
同样的,共享内存,信号量和消息队列的公共部分知识也都同理
首先:使用XSI IPC需要首先了解标识符和键的概念
标识符是标识IPC对象的一个量,通常由一个int型变量表示,不过标识符只是IPC对象的内部名,如果要使的多个进程能够使用同一个IPC,需要得到一个外部名,这个外部名就是键--KEY,每个IPC对象都与一个键相关联
对于消息队列:可以通过函数magget通过一个键获得他的标识符,即通过外部标识得到内部标识的一个方法
例如:我们知道一个消息队列的键是msg_key;
那么:可以通过下列代码段
int msg_id;
nsg_id=msgget(msg_key,0666|IPC_CREAT|IPC_EXCL);
获取消息队列的ID。
得到了消息队列的ID后,我们就可以开始作很多行为了
如果你想要改变消息队列的一些属性,可以使用函数msgctl
如果想从消息队列中发送消息或获取消息,可以使用这两个函数
msgsnd,msgrcv
下面详细讲解一下msgsnd
这个函数的原型是:
int msgsnd(int msgid,const void *ptr,size_t nbytes,int flags);
第一个参数是消息队列的ID
第二个参数是要发送给消息队列的正长整形类型字段 稍后解释这个参数
第三个参数是要发送的实际数据字节(对应于长度)
第四个参数是设置符
如果我们想发送一段数据,我们可以这样做:
首先,建立一个这样的结构体
struct mymsg
{
long mtype; //这就是第二个参数所说的正长整形类型字段,表示发送信息的类型
char mtext[SIZE]; //size 可以自定,跟第三个参数有关
};
下面是向消息队列发送一段数据的代码段
struct mymsg
{
long type;
char mtext[10];
} msg;
msg.type=1;
strcpy(msg.mtext,"hello");
if(msgsnd(msg_id,&msg,10,IPC_NOWAIT)==-1)
fatal("msgsnd");
printf("send sucess!/n");
exit(0);
值得注意的是,第三个参数是结构体中第二个成员的大小,而不是整个结构体的大小
下面是《unix环境高级编程》中第15章中习题5.12 刚写的 发出来吧,希望对大家能够有所帮助,如果
有朋友也在看这本书的话,很希望多多交流~~
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/msg.h> #include <sys/types.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #define Q_KEY (key_t)0x15 #define IFLAGS (IPC_CREAT | IPC_EXCL) void fatal(char *mes) { perror(mes); exit(1); } int main(void) { int p_id; int i; struct mymsg { long mtype; char mtext[10]; } msg; for(i=0;i<5;i++) { if((p_id=msgget(Q_KEY,0660|IFLAGS))==-1) fatal("msgget"); printf("the ID of msg is :%d /n",p_id); if(msgctl(p_id,IPC_RMID,NULL)==-1) fatal("msgctl"); } for(i=0;i<5;i++) { if((p_id=msgget(IPC_PRIVATE,0660|IFLAGS))==-1) fatal("msgget"); printf("the ID of msg is :%d /n",p_id); msg.mtype=1; strcpy(msg.mtext,"hello"); if(msgsnd(p_id,&msg,10,IPC_NOWAIT)==-1) fatal("msgsnd"); } //by the end of the program , //we use ipcs in shell to see the stat of msgs exit(0);
相关文章推荐
- IPC消息队列使用详细分析
- 消息队列篇—详谈ActiveMQ消息队列模式的分析及使用
- IPC之 - 使用微软消息队列实现C#进程间通信
- rt-thread的IPC机制之消息队列源码分析
- 进程IPC之消息队列基础分析(六)
- [Linux管道和IPC]使用msgget创建消息队列
- IPC之 - .Net 消息队列(MSMQ) 使用
- [Linux管道和IPC]使用msgctl删除消息队列
- IPC之消息队列详解与使用
- 消息队列(Message Queue)基本概念和使用场景分析
- IPC之消息队列详解与使用
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
- Linux 进程间通讯(IPC)详细总结 4消息队列。
- Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用
- Android 中使用极光推送消息详细介绍
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
- 消息队列使用的四种场景介绍
- 使用redis list作为消息队列
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍[转]
- 关于消息队列的使用