/*
*Filename: msgsnd.c
*Description: 消息队列的发送端
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFERSIZE 1024
struct message
{
long int message_type;
char msg_text[BUFFERSIZE];
};
int main()
{
int msgqid; //创建消息队列返回值
struct message msg;
//创建消息队列
msgqid = msgget((key_t)1234,0666 | IPC_CREAT);
if(msgqid < 0)
{
perror("msgget error");
exit(-1);
}
//输出提示信息
printf("Creat message queue %d\n",msgqid);
//向消息队列写数据
while(1)
{
printf("please input:");
scanf("%s",msg.msg_text);
msg.message_type = getpid();
//添加消息到消息队列
if(msgsnd(msgqid,&msg,strlen(msg.msg_text),0) < 0)//写入的长度是不包含数据类型的长度的
{
perror("msgsnd");
exit(-1);
}
//检测结束标志,当接收到end字符串
if(strncmp(msg.msg_text,"end",3) == 0)
{
//结束程序
break;
}
}
exit(0);
}
/**********************************************************************************************************************************************************************************/
/*
*Filename: messagercv.c
*Description: 消息队列的接收端
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFERSIZE 1024
struct message
{
long int message_type;
char msg_text[BUFFERSIZE];
};
int main()
{
int msgqid;
struct message msg;
msgqid = msgget((key_t)1234,IPC_CREAT | 0666);
if(msgqid < 0)
{
perror("msgget error");
exit(-1);
}
printf("Open the message queue %d\n",msgqid);
//当没有读到end结束子串时,保持循环
while(strncmp(msg.msg_text,"end",3))
{
memset(msg.msg_text,0,BUFFERSIZE);
if(msgrcv(msgqid,&msg,BUFFERSIZE,0,0) < 0)
{
perror("msgrcv error");
exit(-1);
}
printf("The message from process :%d\n",msg.message_type);
printf("The message:%s\n",msg.msg_text);
}
//消除消息队列
if((msgctl(msgqid,IPC_RMID,NULL)) < 0)
{
perror("msgctl error");
exit(-1);
}
exit(0);
}
/***********************************************************************************************************************************************************************/
测试结果: