#include <iostream>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <wait.h>
#include <cstdio>
#define SVKEY 75
#define REQ 1
using namespace std;
struct msg{
long msg_type;
char msg_content[256];
}msg;
int pid,msgid;//client的pid 和消息队列的识别码
int *pint;
int i;
void myclient(){
cout << "client start" << endl;
//msgget(key_t key,int msgflg) 返回消息队列的标识符,失败返回1
//msgflg是权限参数0777表示可读可写可执行
msgid = msgget(SVKEY,0777);//打开75消息队列
pid = getpid();//获取client进程标识符
cout << "client pid=" << pid << endl;
pint = (int *)msg.msg_content;//将正文的内容传给pint,并强制转换类型
*pint = pid;//pint指针指向client标识符
msg.msg_type = REQ;//消息类型设置为1
//int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
msgsnd(msgid,&msg,sizeof(int),0);
while(true){
//int msgctl(int msgid, int command, struct msgid_ds *buf);
msgrcv(msgid,&msg,256,pid,0);
if(msg.msg_type != REQ){
printf("(client) receive reply from pid=%d\n",*pint);
break;
}
}
exit(0);
}
void myserver(){
cout << "server start" << endl;
msgid = msgget(SVKEY,0777|IPC_CREAT);//创建75消息队列
while (true){
cout << "checking msg from client" << endl;
msgrcv(msgid,&msg,256,1,0);//接受client进程标识数信息
pint = (int *)msg.msg_content;
pid = *pint;//获得client进程标识数
if(msg.msg_type == REQ){
printf("(server) severing for client pid=%d\n",*pint);
break;
}
}
msg.msg_type = pid;//消息类型设置为client的pid
*pint = getpid();//获取server进程标识数
cout << "server pid=" << *pint << endl;
msgsnd(msgid,&msg,sizeof(int),0);
exit(0);
}
int main(){
i = fork();
if(!i){myserver();}
i = fork();
if(!i){myclient();}
wait(nullptr);
wait(nullptr);
}
os2.1消息缓冲队列实现进程通讯
最新推荐文章于 2023-12-19 07:00:00 发布