消息队列提供一种带有数据标识的特殊管道,使得每一段被写入的数据都变成带标识的 消息,读取该段消息的进程只要指定这个标识就可以正确地读取,而不会受到其他消息的干 扰,从运行效果来看,一个带标识的消息队列,就像多条并存的管道一样。
消息队列相当于增强的管道,给不同进程发的消息做一个标识,进程在读的时候能够只读指定的标识的消息,进而区分不同进程。
标识是通过一个结构体
struct msgbuf {
long msgtype; /* message type, must be > 0 */
char buf[128]; /* message data */
};
long msgtype是必须的,做标识只需要往这个结构体里的msgtype成员赋值,
这个值必须大于0。
发送消息msgsnd(),
接受消息msgrcv(),要传整个结构体的地址,跟传的参数标识做对比。
发送消息代码示例:
#include "test_msg.h" //自己定义了一个头文件,里面包含所有需要的头文件
struct msgbuf{
long mtype; //消息标识,必须大于0
char mtext[128]; //消息内容
};
int main(){
int msgid=msgget(ftok("./",1),IPC_CREAT|0666); //获取一个ip对象
struct msgbuf mymsg;
while(1){
bzero(&mymsg.mtext,128);
fgets(mymsg.mtext,128,stdin);
mymsg.mtype=1;
msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0);
}
}
接受消息代码示例:
#include "test_msg.h" //自己定义了一个头文件,里面包含所有需要的头文件
struct msgbuf{
long mtype; //消息标识,必须大于0
char mtext[128]; //消息内容
};
int main(){
int msgid=msgget(ftok("./",1),IPC_CREAT|0666); //获取一个ip对象
struct msgbuf mymsg;
while(1){
bzero(&mymsg.mtext,128);
mymsg.mtype=1;
msgrcv(msgid,&mymsg,128,1,0);
printf("%S",mymsg.mtext);
}
}