Linux进程通信——消息队列

本文介绍了一个基于Linux系统的进程间通信案例,通过消息队列实现两个进程之间的数据交换。发送者进程向消息队列写入数据,接收者进程从消息队列读取数据并打印出来。当发送者发送特殊字符串end时,双方结束通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息发送者进程:

/*
 * 进程间通信之消息队列,代码源自《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();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值