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

目录
相关文章
|
1月前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
77 24
Linux系统之whereis命令的基本使用
|
1月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
126 48
|
4天前
|
存储 缓存 Linux
Linux系统中如何查看CPU信息
本文介绍了查看CPU核心信息的方法,包括使用`lscpu`命令和读取`/proc/cpuinfo`文件。`lscpu`能快速提供逻辑CPU数量、物理核心数、插槽数等基本信息;而`/proc/cpuinfo`则包含更详细的配置数据,如核心ID和处理器编号。此外,还介绍了如何通过`lscpu`和`dmidecode`命令获取CPU型号、制造商及序列号,并解释了CPU频率与缓存大小的相关信息。最后,详细解析了`lscpu`命令输出的各项参数含义,帮助用户更好地理解CPU的具体配置。
33 8
|
4天前
|
存储 运维 监控
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
|
3月前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
313 78
|
24天前
|
机器学习/深度学习 安全 Linux
Linux 主要应用领域的归纳
服务器领域 Linux在服务器领域的应用是其最为广泛和成熟的领域之一。由于其开源、稳定、高效和安全的特性,Linux成为许多企业服务器的首选操作系统。 Web服务器:Linux是Web服务器的理想选择,因为它支持Apache、Nginx等流行的Web服务器软件,这些软件在Linux上运行稳定且性能卓越。Linux服务器可以高效地处理大量并发请求,提供快速、可靠的Web服务。 数据库服务器:Linux也广泛用于数据库服务器,如MySQL、PostgreSQL和Oracle等数据库管理系统在Linux上运行良好。Linux的稳定性和安全性使得它成为存储和管理敏感数据的理想平台。 邮件服务器:Lin
65 5
|
2月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
167 23
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
185 20
|
3月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
103 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
138 13