Linux系统消息队列

Linux系统消息队列

实现代码

  • Receiver.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;

const int BUFFER_SIZE = 1024;
const int KEY = 6666;

struct Message {
    int messageType;
    char buffer[BUFFER_SIZE];
};

int main(int argc, char const *argv[])
{
    int messageID;
    Message message;
    int messageReceive = 0;

    if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {
        fprintf(stderr, "Message get failed!\n");
        abort();
    }

    while (true) {
        if (msgrcv(messageID, (void*)&message, BUFFER_SIZE, messageReceive, 0) == - 1) {
            fprintf(stderr, "Message receive failed!\n");
            abort();
        }
        printf("Receive data: %s", message.buffer);
        if (!strncmp(message.buffer, "finish", 6)) {
            break;
        }
    }

    if (msgctl(messageID, IPC_RMID, 0) == -1) {
        fprintf(stderr, "Message delete failed!\n");
        abort();
    }
    return 0;
}
  • Sender.cpp
#include <bits/stdc++.h>
#include <unistd.h>
#include <sys/msg.h>
using namespace std;

const int BUFFER_SIZE = 1024;
const int KEY = 6666;

struct Message {
    int messageType;
    char buffer[BUFFER_SIZE];
};

int main(int argc, char const *argv[])
{
    Message message;
    int messageID;
    
    if ((messageID = msgget((key_t)KEY, 0666 | IPC_CREAT)) == -1) {
        fprintf(stderr, "Message get failed!\n");
        abort();
    }

    while (true) {
        char buffer[BUFFER_SIZE];
        printf("Send data:");
        fgets(buffer, BUFFER_SIZE, stdin);
        message.messageType = 1;
        strcpy(message.buffer, buffer);

        if (msgsnd(messageID, (void*)&message, BUFFER_SIZE, 0) == -1) {
            fprintf(stderr, "Message send failed!\n");
            abort();
        }
        usleep(100);
        
        if (!strncmp(message.buffer, "finish", 6)) {
            break;
        }
    }

    return 0;
}

相关函数

msgget()

  • 函数原型
    int msgget(key_t key, int msgflg);
  • 参数
  1. key为消息队列关联键
  2. msgflg为消息队列的建立标志和存取权限
  • 返回值

成功返回消息队列标识值,否则返回-1

  • 功能

用于创建一个新的或打开一个已经存在的消息队列

msgrcv()

  • 函数原型
    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
  • 参数
  1. msqid为消息队列的识别码
  2. msgp是指向消息缓冲区的指针
  3. msgtyp为消息类型
    msgtyp等于0 则返回队列的最早的一个消息。
    msgtyp大于0,则返回其类型为msgtyp的第一个消息。
    msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。
  4. msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
  • 返回值

成功返回拷贝到mtext数组的实际字节数,否则返回-1

  • 功能

从消息队列中读取消息

msgsnd()

  • 函数原型
    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
  • 参数
  1. msqid为消息队列的识别码
  2. msgp是指向消息缓冲区的指针
  3. msgtyp为消息类型
    msgtyp等于0 则返回队列的最早的一个消息。
    msgtyp大于0,则返回其类型为msgtyp的第一个消息。
    msgtyp小于0,则返回其类型小于或等于mtype参数的绝对值的最小的一个消息。
  4. msgflg:这个参数依然是控制函数行为的标志,取值可以是:0,表示忽略
  • 返回值

成功返回0,否则返回-1

  • 功能

将一个新的消息写入队列

编译

  • 注意编译的文件名与实现代码文件名保持一致
g++ Receiver.cpp -o Receiver
g++ Sender.cpp -o Sender
./Receiver & ./Sender

测试结果

Send data:This
Receive data: This
Send data:is 
Receive data: is
Send data:sender
Receive data: sender
Send data:finish
Receive data: finish

鸣谢

百度百科

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值