os2.1消息缓冲队列实现进程通讯

#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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值