消息队列(message queue)

/*
 *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);

}


/***********************************************************************************************************************************************************************/

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值