您的位置:首页 > 其它

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 刚写的 发出来吧,希望对大家能够有所帮助,如果

有朋友也在看这本书的话,很希望多多交流~~

#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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: