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
运行截图: