消息发送者进程:
/*
* 进程间通信之消息队列,代码源自《Linux程序设计》
*/
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
using namespace std;
#define BUFSIZ (2048)
// 用户自定义的数据结构
// 请注意,这个结构的第一个字段必须是long类型的msgtype字段,剩下字段可以自定义
struct msg_st
{
long msg_type;
char text[BUFSIZ];
};
// 消息发送者进程
int sender()
{
int running = 1;
// 用户数据结构对象
struct msg_st data;
// 用户存放用户输入数据的缓冲区
char buffer[BUFSIZ]= {0};
// 消息队列的id
int msgid;
// 创建或者打开消息队列
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(-1 == msgid)
{
return -1;
}
while (running)
{
cout<< "Please input something:";
// 获取用户输入,并把它当作消息发给消息接收者进程
fgets(buffer,BUFSIZ,stdin);
// 设置消息的类型是1
data.msg_type = 1;
strcpy(data.text,buffer);
// 发送消息,注意长度字段并不包括long类型的msgtype字段,这里很重要!!!
if(msgsnd(msgid,(void*)&data,BUFSIZ,0) == -1)
{
return -1;
}
// 如果用户输入end,表示退出
if(0 == strncmp(buffer,"end",3))
{
running = 0;
}
}
}
int main(int argc,char* argv[])
{
return sender();
}
消息接收者进程:
/*
* 进程间通信之消息队列,代码源自《Linux程序设计》
*/
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/msg.h>
using namespace std;
#define BUFSIZ (2048)
// 用户自定义的数据结构
// 请注意,这个结构的第一个字段必须是long类型的msgtype字段,剩下字段可以自定义
struct msg_st
{
long msg_type;
char text[BUFSIZ];
};
// 消息接收者进程
int recver()
{
int running = 1;
// 消息队列的id
int msgid;
// 用户数据
struct msg_st data;
// 消息类型
long msg_type = 1;
// 创建消息队列
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1)
{
return -1;
}
while(running)
{
// 接收消息,msg_type表示需要接收的消息的类型,注意msg_type=0表示接收消息队列中可用的第一个消息
if(msgrcv(msgid,(void*)&data,BUFSIZ,msg_type,0) == -1)
{
return -1;
}
// 输出消息
cout << data.text << " ";
// 如果消息是end,表示退出
if(strncmp(data.text,"end",3) == 0)
{
running = 0;
}
}
// 删除消息队列
if(msgctl(msgid,IPC_RMID,0) == -1)
{
return -1;
}
return 0;
}
int main(int argc,char* argv[])
{
return recver();
}