linux多个进程通过消息队列进行通信

多个进程通过消息队列进行通信,通过多个进程(至少3个;独立创建多个codeblocks程序),实现以下内容:1)消息队列及其管理(创建消息、插入消息和获取消息);2)进程之间关于消息队列的互斥与同步。不能使用系统自带的消息通信机制

尝试下下面代码:
代码如下:

发送端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/msg.h>

struct mymesg{
    long int mtype;
    char mtext[512];
};

int main(void)
{
    int id = 0;
    struct mymesg ckxmsg;
    key_t key = ftok("/tmp",66);
    id = msgget(key,IPC_CREAT | 0666);
    if(id == -1){
        printf("create msg error \n");
        return 0;
    }
    
    while(1){
        char msg[512];
        memset(msg,0,sizeof(msg));
        ckxmsg.mtype = 1;
        printf("input message:");
        fgets(msg,sizeof(msg),stdin);
        strcpy(ckxmsg.mtext,msg);
 
        if(msgsnd(id,(void *)&ckxmsg,512,0) < 0){
            printf("send msg error \n");
            return 0;
        }
 
        if(strncmp(msg,"QUIT",4) == 0)
            break;
    }
    
    if(msgctl(id,IPC_RMID,NULL) < 0){
        printf("del msg error \n");
        return 0;
    }
    return 0;
}

接收端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/ipc.h>
#include<sys/msg.h>

struct mymesg{
    long int mtype;
    char mtext[512];
};

int main(void)
{
    int id = 0;
    struct mymesg ckxmsg;
    key_t key = ftok("/tmp",66);
    id = msgget(key,0666|IPC_CREAT);
    if(id == -1){
        printf("open msg error \n");
        return 0;
    }
    
    while(1){
        if(msgrcv(id,(void *)&ckxmsg,512,1,0) < 0){
            printf("receive msg error \n");
            return 0;
        }
        printf("data:%s\n",ckxmsg.mtext);
        if(strncmp(ckxmsg.mtext,"QUIT",4) ==0)
            break;
    }
    return 0;
}

参考资料:

如有问题,及时沟通。
如有帮助,欢迎点赞。

这个问题可以通过zeromq来实现,其中的通讯模式可以根据需要搭配,最基础的req-resp、router-dealer等等,应该可以有所启发。

一文带你入门了解“零之禅“消息队列ZeroMQ_董哥的黑板报的博客-CSDN博客_zeromq 一、ZeroMQ概述ZeroMQ(又名ØMQ,MQ,或zmq)看起来像一个可嵌入的网络库,但其作用就像一个并发框架ZeroMQ类似于标准Berkeley套接字,其提供了各种传输工具,如进程内、进程间、TCP和组播中进行原子消息传送的套接字你可以使用各种模式实现N对N的套接字连接,这些模式包括:扇出、发布-订阅、任务分配、请求-应答ZeroMQ的速度足够快,因此可充当集群产品的结构... https://blog.csdn.net/qq_41453285/article/details/105984928?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165215366116782184639491%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165215366116782184639491&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-105984928-null-null.142^v9^pc_search_result_cache,157^v4^control&utm_term=ZeroMQ&spm=1018.2226.3001.4187