System V消息队列
服务端
#include <iostream>
#include <sys/msg.h>
#include <strings.h>
#include <string.h>
#include <stdio.h>
#include <error.h>
#include <sys/ipc.h>
using namespace std;
typedef struct tagMsg
{
long mtype;
char mtext[512];
}Msg;
int main()
{
Msg msg;
key_t key=ftok("/tmp",0);
int ret=0;
int id=msgget(key,IPC_EXCL);
if(id<0)
{
id=msgget(key,0655|IPC_CREAT);
if(id<0)
{
perror("create message queue failed!\n");
exit(-1);
}
}
// recv type=1
bzero(&msg,sizeof(msg));
ret=msgrcv(id,(void*)&msg,512,1,0);
cout<<"recv:"<<msg.mtext<<endl;
cout<<"ret:"<<ret<<endl;
if(ret==-1)
{
perror("send failed!");
exit(-1);
}
// send type=2
msg.mtype=2;
strcpy(msg.mtext,"Hello I'm Server!");
cout<<"send:"<<msg.mtext<<endl;
ret=msgsnd(id,(void*)&msg,512,0);
cout<<"ret:"<<ret<<endl;
if(ret==-1)
{
perror("send failed!");
exit(-1);
}
return 0;
}
客户端
#include <iostream>
#include <sys/msg.h>
#include <strings.h>
#include <string.h>
#include <stdio.h>
#include <error.h>
#include <sys/ipc.h>
using namespace std;
typedef struct tagMsg
{
long mtype;
char mtext[512];
}Msg;
int main()
{
Msg msg;
key_t key=ftok("/tmp",0);
int ret=0;
int id=msgget(key,IPC_EXCL);
if(id<0)
{
id=msgget(key,0655|IPC_CREAT);
if(id<0)
{
perror("create message queue failed!\n");
exit(-1);
}
}
// send type=1
msg.mtype=1;
strcpy(msg.mtext,"Hello I'm Client!");
cout<<"send:"<<msg.mtext<<endl;
ret=msgsnd(id,(void*)&msg,512,0);
cout<<"ret:"<<ret<<endl;
if(ret==-1)
{
perror("send failed!");
exit(-1);
}
// recv type=2
bzero(&msg,sizeof(msg));
ret=msgrcv(id,(void*)&msg,512,2,0);
cout<<"recv:"<<msg.mtext<<endl;
cout<<"ret:"<<ret<<endl;
if(ret==-1)
{
perror("send failed!");
exit(-1);
}
return 0;
}
CC=g++
all:ser cli
ser:ipc_ser.cpp
${CC} ipc_ser.cpp -o ser
cli:ipc_cli.cpp
${CC} ipc_cli.cpp -o cli
运行截图:


该示例展示了使用SystemV消息队列在服务端和客户端之间进行数据交换的过程。服务端首先接收类型为1的消息,然后发送类型为2的消息;客户端则发送类型为1的消息并接收类型为2的消息。通过消息队列实现了进程间的通信。
690

被折叠的 条评论
为什么被折叠?



