前面我分享了一篇有关于消息队列的博客, 这里附上我写的一段消息队列的程序:
\
send.c(发送端)
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
int main()
{
key_t key = ftok("./", 1); //获得与路径pathname相对应的键值
if (-1 == key)
{
perror("ftok");
exit(1);
}
int msgid = msgget(key, IPC_CREAT); //创建消息队列,msgid为消息队列的描述字
if (-1 == msgid)
{
perror("msgget");
exit(2);
}
struct msgbuf buffer;
memset(buffer.mtext, 0, 1024);
int type = 1;
char text[1024] = {0};
while (1)
{
scanf("%d %s", &type, text);
buffer.mtype = type;
strcpy(buffer.mtext, text);
if (-1 == msgsnd(msgid, &buffer, sizeof(buffer.mtext), 0)) //将数据写入消息队列
{
perror("msgsnd");
exit(3);
}
memset(text, 0, 1024);
if (0 == strcmp(buffer.mtext, "exit")) //退出
{
break;
}
memset(text, 0, 1024);
memset(buffer.mtext, 0, 1024);
}
return 0;
}
recv.c(接收端)
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
struct msgbuf
{
long mtype;
char mtext[1024];
};
int main()
{
key_t key = ftok("./", 1);
if (-1 == key)
{
perror("ftok");
exit(1);
}
int msgid = msgget(key, IPC_CREAT);
if (-1 == msgid)
{
perror("msgget");
exit(2);
}
struct msgbuf buffer;
memset(buffer.mtext, 0, 1024);
int type = 0;
scanf("%d", &type);
// buffer.mtype = type;
while (1)
{
int count = msgrcv(msgid, &buffer, sizeof(buffer.mtext), type, 0); //从消息队列读出数据, type-消息类型
if (-1 == count)
{
perror("msgrcv");
exit(4);
}
if (0 == strcmp(buffer.mtext, "exit")) //退出
{
msgctl(msgid, IPC_RMID, 0); //删除msgid标识的消息队列
break;
}
printf("recv: mtype = %d mtext = %s\n", buffer.mtype, buffer.mtext);
memset(buffer.mtext, 0, 1024);
}
return 0;
}