IPC消息队列使用详细分析
2009-10-26 20:35 htc开发 阅读(265) 评论(0) 编辑 收藏 举报虽然说是进程间通信中有关消息队列的一个比较详细的分析
同样的,共享内存,信号量和消息队列的公共部分知识也都同理
首先:使用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 刚写的 发出来吧,希望对大家能够有所帮助,如果
有朋友也在看这本书的话,很希望多多交流~~