Linux IPC实践(6) --System V消息队列(3)

简介: 消息队列综合案例消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息server进程发送时, 将mtype指定为接收到的client进程的p...

消息队列综合案例

消息队列实现回射客户/服务器

 

server进程接收时指定msgtyp0, 从队首不断接收消息

server进程发送时, 将mtype指定为接收到的client进程的pid

 

client进程发送的时候, mtype指定为自己进程的pid

client进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pid的消息;

// client/server进程接收/发送的数据结构
const int MSGMAX = 8192;
struct msgBuf
{
    long mtype;         //保存客户进程的pid(需要将pid强制转换成为long)
    char mtext[MSGMAX]; //保存客户进程真实发送的数据
};
//server.cpp
void echoServer(int msgid)
{
    struct msgBuf buf;
    int nrcv;
    while (true)
    {
        bzero(&buf, sizeof(buf));
        if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)
            err_exit("msgrcv error");
        cout << "recv: " << buf.mtext;
        if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)
            err_exit("msgsnd error");
    }
}

int main()
{
    key_t key = ftok("/tmp/echoSeed", 0x1234);
    int msgid = msgget(key, IPC_CREAT|0666);
    if (msgid == -1)
        err_exit("msgget error");

    echoServer(msgid);
}
//client.cpp
void echoServer(int msgid)
{
    struct msgBuf buf;
    int nrcv;
    while (true)
    {
        bzero(&buf, sizeof(buf));
        if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)
            err_exit("msgrcv error");
        cout << "recv: " << buf.mtext;
        if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)
            err_exit("msgsnd error");
    }
}

int main()
{
    key_t key = ftok("/tmp/echoSeed", 0x1234);
    int msgid = msgget(key, IPC_CREAT|0666);
    if (msgid == -1)
        err_exit("msgget error");

    echoServer(msgid);
}

附-ftok用法

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);

描述信息:

   The ftok() function uses the identity(象征) of the file named by the given pathname (which must refer 

to an existing, accessible file[必须是一个已经存在,并且可访问的文件]) and the least significant(有效的) 8 bits[有效的最低8位] of proj_id (which must  be  nonzero)  to  generate  a  key_t  type  System V IPC key, suitable 

for use with msgget(2), semget(2), or shmget(2).   The resulting value is the same for all pathnames that name the same file, when the  same value  of  proj_id  

is used(如果文件名与proj_id的有效位全都相同的话, 则生成的key一定也是相同的).  The value returned should be different when 

the (simultaneously existing) files or the project IDs differ.

 

RETURN VALUE   On success, the generated key_t value is returned.  On failure -1 is returned, 

with errno indicating the error as for the stat(2) system call.

目录
相关文章
|
消息中间件 存储 监控
活动实践 | 快速体验云消息队列RocketMQ版
本方案介绍如何使用阿里云消息队列RocketMQ版Serverless实例进行消息管理。主要步骤包括获取接入点、创建Topic和订阅组、收发消息、查看消息轨迹及仪表盘监控。通过这些操作,用户可以轻松实现消息的全生命周期管理,确保消息收发的高效与可靠。此外,还提供了消费验证、下载消息等功能,方便用户进行详细的消息处理与调试。
|
消息中间件 监控 数据挖掘
【有奖实践】轻量消息队列(原 MNS)订阅 OSS 事件实时处理文件变动
当你需要对对象存储 OSS(Object Storage Service)中的文件变动进行实时处理、同步、监听、业务触发、日志记录等操作时,你可以通过设置 OSS 的事件通知规则,自定义关注的文件,并将 OSS 事件推送到轻量消息队列(原 MNS)的队列或主题中,开发者的服务即可及时收到相关通知,并通过消费消息进行后续的业务处理。
406 102
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
588 112
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
616 48
|
消息中间件 对象存储
轻量消息队列(原 MNS)订阅 OSS 事件实践
使用轻量消息队列订阅OSS事件,实时处理文件变动,赢取ins风U型枕(限量500个)。访问活动页面,完成实操并上传截图即可参与领奖。活动时间:即日起至2025年2月28日16:00。奖品数量有限,先到先得,快来报名吧!
429 2
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
1151 19
|
消息中间件 Java 开发工具
【实践】快速学会使用云消息队列RabbitMQ版
本次分享的主题是快速学会使用云消息队列RabbitMQ版的实践。内容包括:如何创建和配置RabbitMQ实例,如Vhost、Exchange、Queue等;如何通过阿里云控制台管理静态用户名密码和AccessKey;以及如何使用RabbitMQ开源客户端进行消息生产和消费测试。最后介绍了实验资源的回收步骤,确保资源合理利用。通过详细的操作指南,帮助用户快速上手并掌握RabbitMQ的使用方法。
1269 10
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版实践解决方案评测
随着企业业务的增长,对消息队列的需求日益提升。阿里云的云消息队列 RabbitMQ 版通过架构优化,解决了消息积压、内存泄漏等问题,并支持弹性伸缩和按量计费,大幅降低资源和运维成本。本文从使用者角度详细评测这一解决方案,涵盖实践原理、部署体验、实际优势及应用场景。