Linux系统之《消息队列》入手应用

简介: 消息队列是Linux进程间通信方式之一,消息队列一般是用于简单的通信,数据量不大,通信不频繁的情况。如果交互频繁或者数据量大就不适合了。

代码
下面直接上代码,发送端代码:

//file name: msg_test.c

#include "msg_test.h"

//创建消息队列
int Creat_msg(char *path, int id)
{
   
    key_t key;
    int msg_id;
    puts(path);
    if ((key = ftok(path, id)) == -1)
    {
   
        perror("ftok");
        exit(-1);
    }
    else 
    {
   
        printf("key = %d\n", key);
    }

    if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
    {
   
        perror("msgget");
        exit(-1);
    }
    else 
    {
   
        printf("msg_id = %d\n", msg_id);
    }    
    return msg_id;
}
struct msg 
{
   
    long type;
    char buf[256+1];
};
int 
main(int argc, char **argv)
{
   
    int msgid = 0;
    int ret = 0;
    struct msg_struct msg_buf;
    struct msg buf1;
    bzero(&msg_buf, sizeof(msg_buf));

    if(argc != 3)
    {
   
        printf("Usag: ./%s path id\n", argv[0]);
        return 0;
    }

    printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
    msgid = Creat_msg(argv[1], atoi(argv[2]));
    printf("msgid = %d\n", msgid);

    buf1.type = 0x32;
#if 1
    while(1)
    {
   
        ret = msgsnd(msgid, (void *)&buf1, 256, 0); //最后一个参数IPC_NOWAIT可以设置非阻塞
        //perror("msgrecv");
        printf("ret = %d, errno = %d\n", ret, errno);
        if(ret  < 0 )
        {
   
            printf("get ENOMSG\n");
            return 0;
        }
        usleep(2000);
    }
#endif    
    if(msgctl(msgid, IPC_RMID, NULL)< 0)
    {
   
        perror("");
    }
    else 
    printf("rm OK!");
    return 0;
}

接收端代码:

//file name: msg_test.c

#include "msg_test.h"

//创建消息队列
int Creat_msg(char *path, int id)
{
   
    key_t key;
    int msg_id;
    puts(path);
    if ((key = ftok(path, id)) == -1)
    {
   
        perror("ftok");
        exit(-1);
    }
    else 
    {
   
        printf("key = %d\n", key);
    }

    if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
    {
   
        perror("msgget");
        exit(-1);
    }
    else 
    {
   
        printf("msg_id = %d\n", msg_id);
    }    
    return msg_id;
}
struct msg 
{
   
    long type;
    char buf[256+1];
};
int 
main(int argc, char **argv)
{
   
    int msgid = 0;
    int ret = 0;
    struct msg_struct msg_buf;
    struct msg buf1;
    bzero(&msg_buf, sizeof(msg_buf));

    if(argc != 3)
    {
   
        printf("Usag: ./%s path id\n", argv[0]);
        return 0;
    }
    printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
    msgid = Creat_msg(argv[1], atoi(argv[2]));
    printf("msgid = %d\n", msgid);


#if 1
    while(1)
    {
   
        ret = msgrcv(msgid, (void *)&buf1, 256, 0x32, 0); //最后一个参数使用IPC_NOWAIT可以设置非阻塞
        //perror("msgrecv");
        printf("ret = %d, errno = %d\n", ret, errno);
        if(ret  < 0 )
        {
   
            printf("get ENOMSG\n");
            return 0;
        }        
    }
#endif    
    if(msgctl(msgid, IPC_RMID, NULL)< 0)
    {
   
        perror("");
    }
    else 
    printf("rm OK!");
    return 0;
}

编译

gcc msg_send.c  -o msg_send
gcc msg_test.c  -o msg_recv

运行
接收端:

./msg_recv  /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 256, errno = 0   //接收到数据
ret = 256, errno = 0

发送端:

./msg_send  /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 0, errno = 0     //发送成功
ret = 0, errno = 0

目录
相关文章
|
3天前
|
存储 移动开发 Linux
Linux系统之部署h5ai目录列表程序
【5月更文挑战第3天】Linux系统之部署h5ai目录列表程序
15 1
|
18小时前
|
负载均衡 Linux 应用服务中间件
Linux系统中前后端分离项目部署指南
Linux系统中前后端分离项目部署指南
|
20小时前
|
人工智能 数据可视化 Unix
【Linux】Linux系统基础指令 ( 1 )
本文讲解的指令是基础的操作,下一篇文章我们将继续讲解不同指令。
6 0
|
22小时前
|
Linux 测试技术 网络安全
Linux系统之部署2048网页小游戏
【5月更文挑战第5天】Linux系统之部署2048网页小游戏
10 0
Linux系统之部署2048网页小游戏
|
1天前
|
前端开发 Java 关系型数据库
2023全网最详细的若依开源项目部署,将其部署到Linux操心系统中
2023全网最详细的若依开源项目部署,将其部署到Linux操心系统中
|
1天前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
11 0
|
1天前
|
存储 缓存 安全
Linux系统内核面试题
Linux系统内核面试题
11 3
|
1天前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
6 0
|
2天前
|
数据采集 Linux Go
Linux系统是如何控制串口收发数据的?
Linux系统是如何控制串口收发数据的?
12 0
|
2天前
|
安全 Linux Shell
Linux常用命令详解与实战应用
【5月更文挑战第7天】本文详述了Linux常用命令,包括文件与目录操作(ls, cd, pwd, cp, mv, rm)、文本处理(cat, grep, sed)及系统管理(top, df, du)命令。通过实例演示了如何使用这些命令,帮助读者理解和掌握Linux操作,提升系统管理效率。学习和熟练运用这些基础命令,是高效使用Linux的关键。