消息队列创建和通信

简介: 消息队列创建和通信

消息队列,信号量,共享内存通称为system-V IPC,在系统中他们都是用一种名为key的键值来做唯一标识,他们被创建后,不会因为进程的退出而消失,而会持续的存在,除非调用特殊的函数或命令删除。


ftok函数

1)pathname:在一个项目里面,所有进程都在同一路径里面,pathname指的是一个路径。

2)proj_id:IPC的标识,表示key值

当路径和IPC的标识都一样时,创建出来的key值是一样的。

key的作用:申请对应传输机制的空间资源和确定传输机制

消息队列:消息队列需要的空间,确定传输机制

共享内存:共享内存需要的空间,确定传输机制

信号量:信号量需要的空间,确定传输机制


注意:当要重复创建不同的但是有相同的IPC时,需要不同的key值

不一样的key值,就可以创建多个相同的IPC

当key值相同,操作的就是同一个IPC对象


例子:创建两个不同的key值:

#define IPC_MASK_A 1
#define IPC_MASK_B 2

int main()
{
   key_t key_a = ftok("./",IPC_MASK_A);
   key_t key_b = ftok("./",IPC_MASK_B);
   if(key_a == -1 || key_b == -1)
   {
       perror("ftok");

       return -1;
   }
   else
   {
       printf("%d---%d\n",key_a,key_b);
   }

    return 0;
}

如何用key值创建消息队列-----msgget

mode:访问的权限只有读和写没有执行(0666)

查看和删除当前系统的IPC对象


示例代码:

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define IPC_MASK_A 1
#define IPC_MASK_B 2

int main()
{
   key_t key_a = ftok("./",IPC_MASK_A);
   key_t key_b = ftok("./",IPC_MASK_B);
   if(key_a == -1 || key_b == -1)
   {
       perror("ftok");

       return -1;
   }
   else
   {
       printf("%d---%d\n",key_a,key_b);
   }

    int msg_queue_id_a = msgget(key_a,IPC_CREAT | 0666);
    int msg_queue_id_b = msgget(key_b,IPC_CREAT | 0666);
    if(msg_queue_id_a == -1 || msg_queue_id_b == -1)
    {
        perror("msgget");
        return -1;
    }
    else
    {
        printf("%d---%d\n",msg_queue_id_a,msg_queue_id_b);
    }

    return 0;
}


消息队列如何通信

示例代码:

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

#define MSG_LENGTH 24
#define IPC_MASK_A 1
#define IPC_MASK_B 2
#define MSG_MASK   1L

int main()
{
   key_t key_a = ftok("./",IPC_MASK_A);
   key_t key_b = ftok("./",IPC_MASK_B);
   if(key_a == -1 || key_b == -1)
   {
       perror("ftok");

       return -1;
   }
   else
   {
       printf("%d---%d\n",key_a,key_b);
   }

    int msg_queue_id_a = msgget(key_a,IPC_CREAT | 0666);
    int msg_queue_id_b = msgget(key_b,IPC_CREAT | 0666);
    if(msg_queue_id_a == -1 || msg_queue_id_b == -1)
    {
        perror("msgget");
        return -1;
    }
    else
    {
        printf("%d---%d\n",msg_queue_id_a,msg_queue_id_b);
    }


    struct msgbuf 
    {
            long mtype;       /* message type, must be > 0 */
            char mtext[MSG_LENGTH];    /* message data */
    }msg_inf_send,msg_inf_rev;


    /*调用msgsnd函数发送消息*/
    memset(&msg_inf_send,0,sizeof(msg_inf_send));
    memset(&msg_inf_rev,0,sizeof(msg_inf_rev));

    msg_inf_send.mtype = MSG_MASK;

        memset(msg_inf_send.mtext,0,MSG_LENGTH);
        memset(msg_inf_rev.mtext,0,MSG_LENGTH);
        
        printf("请输入要发送的消息:");
        scanf("%s",msg_inf_send.mtext);

        int msgsnd_ret = msgsnd(msg_queue_id_a,&msg_inf_send,strlen(msg_inf_send.mtext),0);
        if(msgsnd_ret == -1)
        {
            perror("msgsnd");

            return -1;
        }
        else
        {
            printf("发送消息成功!!!!\n");
        }

        /*调用msgrcv读取消息*/
        int msgrcv_ret = msgrcv(msg_queue_id_a,&msg_inf_rev,MSG_LENGTH,MSG_MASK,0);
        if(msgrcv_ret == -1)
        {
            perror("msgrcv");
            return -1;
        }
        else
        {
            printf("消息是:%s\n",msg_inf_rev.mtext);
        }
    int msgctl_ret_a = msgctl(msg_queue_id_a,IPC_RMID,NULL);
    int msgctl_ret_b = msgctl(msg_queue_id_b,IPC_RMID,NULL);
    if(msgctl_ret_a == -1 || msgctl_ret_b == -1)
    {
        perror("msgctl");
        return -1;
    }

    return 0;
}


控制设置消息队列的接口

相关文章
|
5天前
|
消息中间件 存储 监控
消息队列通信的优缺点
【10月更文挑战第29天】消息队列通信具有诸多优点,如解耦性强、异步通信、缓冲削峰等,能够有效地提高系统的灵活性、可扩展性和稳定性。但同时也存在一些缺点,如系统复杂性增加、性能开销、数据一致性挑战和实时性受限等。在实际应用中,需要根据具体的业务需求和场景,权衡其优缺点,合理地选择和使用消息队列通信机制,以实现系统的高效运行和优化。
|
5天前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
5月前
|
消息中间件 存储 中间件
中间件消息队列协议异步通信
【6月更文挑战第5天】
44 2
|
4月前
|
消息中间件 监控 Java
在Java应用中实现微服务间的消息队列通信
在Java应用中实现微服务间的消息队列通信
|
6月前
|
消息中间件 存储 物联网
AMQP(Advanced Message Queuing Protocol)是一种标准化的消息队列协议,用于异步通信和消息传递
AMQP是开放标准的消息队列协议,确保异步通信中的消息路由、可靠性和灵活性。它支持持久化、确认机制,防止消息丢失,允许灵活路由与定制,适用于多领域,如企业应用、云计算和物联网。
137 0
|
6月前
|
消息中间件 缓存 API
|
消息中间件 微服务
微服务通信:RPC、消息队列和事件驱动架构的比较
在微服务架构中,微服务之间的通信是至关重要的。为了实现松耦合、高效可靠的通信,开发人员可以选择不同的通信方式,包括RPC(远程过程调用)、消息队列和事件驱动架构。本文将对这三种常见的微服务通信方式进行比较,探讨它们的特点、适用场景和优缺点,帮助开发人员选择合适的通信方式。
332 0
|
消息中间件 传感器 网络协议
物联网通信消息队列客户端-MQTT简介
物联网通信消息队列客户端-MQTT简介
570 0
物联网通信消息队列客户端-MQTT简介
|
消息中间件 Linux PHP
php进程通信-消息队列(2)
php进程通信-消息队列
106 0
php进程通信-消息队列(2)
|
消息中间件 Linux PHP
php进程通信-消息队列(1)
php进程通信-消息队列
117 0
php进程通信-消息队列(1)