1.机制
2.源码
消息队列的运行方式与命名管道非常相似。
欲与其他进程通信的进程只需要将消息发送到消息队列中,目的进程就从消息队列中读取需要的消息。2.源码
1)发送方
//msg_send.c
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int msg_id,msg_flags;
int reval;
char send_msg[64];
msg_flags=IPC_CREAT|0666;
msg_id=msgget((key_t)456,msg_flags);
if(-1==msg_id)
{
printf("msg create error.\n");
exit(EXIT_FAILURE);
}
memset(send_msg,0,64);
sprintf(send_msg,"Hi,I'm %d.",getpid());
reval=msgsnd(msg_id,send_msg,sizeof(send_msg),0);
if(-1==reval)
{
printf("message send error.\n");
exit(EXIT_FAILURE);
}
else
printf("Send message:%s\n",send_msg);
return 0;
}
2)接收方
//msg_rcvr.c
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int msg_id,msg_flags;
int reval;
char send_msg[64];
msg_flags=IPC_CREAT|0666;
msg_id=msgget((key_t)456,msg_flags);
if(-1==msg_id)
{
printf("msg create error.\n");
exit(EXIT_FAILURE);
}
memset(send_msg,0,64);
reval=msgrcv(msg_id,send_msg,64,0,0);
if(-1==reval)
{
printf("message send error.\n");
exit(EXIT_FAILURE);
}
else
printf("Received msg:%s\n",send_msg);
reval=msgctl(msg_id,IPC_RMID,0);
if(-1==reval)
{
printf("remove msg queue error\n");
exit(EXIT_FAILURE);
}
return 0;
}
3.mystery注解
1) msgget()函数与信号量的semget()函数相似,作用是创建一个消息队列。
2)msqid为消息队列ID
3)消息队列可以在几个进程之间复用,具有一定的独立性,比命名管道更加灵活,也不需要打开与关闭。
4)在最后一个进程使用完消息队列后,不要忘记删除这个消息队列
本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1155035