专栏首页xcywtLinux进程间通信之消息队列

Linux进程间通信之消息队列

  马上过年了,心里万般滋味。。。

一,消息队列

1,概念:“消息队列”是在消息的传输过程中保存消息的容器

2,消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。

  对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息

  对消息队列有读权限的进程则可以从消息队列中读走消息

  消息队列是随内核持续的。

3,编程注意事项:使用时先把数据封装成消息,把消息存入队列

编程步骤: 具体函数的用法可以用man手册查看(强力推荐)

(1)ftok()生产key

(2)使用msgget( ) 创建/获取消息队列,返回值是队列标识符

(3)使用msgsnd( ) 发送消息

    使用msgrcv( ) 接收消息

(4)使用msgctl( ) 删除消息队列

4,实例:

sendmsg.c   用来发送消息的

// sendmsg.c

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

struct my_msg
{
    int mtype; // 消息类型
    char buf[256];
}msg1, msg2;

int main()
{
    key_t key = ftok("./", 88);

    int msgid = msgget(key, 0666|IPC_CREAT);
    if(-1 == msgid)
    {
        perror("msgget failed!!!");
        exit(1);
    }

    msg1.mtype = 2;
    strcpy(msg1.buf, "hello, msg2");
    msgsnd(msgid, &msg1, sizeof(msg1), 0); // 阻塞
//    msgsnd(msgid, &msg1, sizeof(msg1), IPC_NOWAIT); // 非阻塞

    msg2.mtype = 1;
    strcpy(msg2.buf, "hello, msg1");
    msgsnd(msgid, &msg2, sizeof(msg2), 0); // 阻塞

    printf("消息发送完成,按回车销毁消息队列\n");
    getchar();

    if(-1 == shmctl(msgid, IPC_RMID, NULL))
    {
        perror("shmctl failed");
        exit(2);
    }
    return 0;
}

recvmsg.c  用来接收消息的

// recvmsg.c

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

struct my_msg
{
    int mtype; // 消息类型
    char buf[256];
}msg;

int main()
{
    key_t key = ftok("./", 88);

    // 获取消息队列
    int msgid = msgget(key, 0);
    if(-1 == msgid)
    {
        perror("msgget failed!!!");
        exit(1);
    }

    int res = msgrcv(msgid, &msg, sizeof(msg),
            2, // 取消息类型为2的消息
            0);
    printf("类型:%d, 内容:%s\n", msg.mtype, msg.buf);

    printf("消息接收完成,按回车销毁消息队列\n");
    getchar();

    if(-1 == shmctl(msgid, IPC_RMID, NULL))
    {
        perror("shmctl failed");
        exit(2);
    }
    return 0;
}

5,运行结果

6,获取代码  

git clone https://github.com/xcywt/xcyipc.git

有人看到这个麻烦再乌班图中试试这个库有没有建好。主要是学习github的一些用法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于int的Linux的经典系统调用实现

       先说明两个概念:中断和系统调用 一 系统调用: 是应用程序(运行库也是应用程序的一部分)与操作系统内核之间的接口,它决定了应用程序是如何和内核打交道的。 ...

    xcywt
  • UNIX域协议(无名套接字)

    关于什么是UNIX域套接字可以参考:https://cloud.tencent.com/developer/article/1018893 这里主要介绍非命名的...

    xcywt
  • 《Linux命令行与shell脚本编程大全》第十八章 图形化桌面环境中的脚本编程

    18.1 创建文本菜单 直接上例子吧:   1 #!/bin/bash   2 function menu   3 {   4         clea...

    xcywt
  • linux网络编程之System V 消息队列(二):消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数

    一、msgsnd 和 msgrcv 函数   #include <sys/types.h>   #include <sys/ipc.h>   #inclu...

    s1mba
  • 聊聊JESA的EventRecorder

    JESA/src/main/java/Jesa/EventRecorder.java

    codecraft
  • 聊聊JESA的EventRecorder

    JESA/src/main/java/Jesa/EventRecorder.java

    codecraft
  • Jenkins(1)- centos7.X下安装Jenkins

    https://www.cnblogs.com/poloyy/category/1645399.html

    小菠萝测试笔记
  • 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

    采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦

    程序员追风
  • RabbitMQ的高级特性概念理解

      答:第一步,生产者保障消息的成功发出。第二步,保障RabbitMQ的节点成功接收到生产者发送的消息。第三步,发送端收到RabbitMQ节点(即Broker)...

    别先生
  • 实习杂记(32):getApplicationInfo或者getPackageManger出错

    getPackageManger  是通过binder通信的,最大通信是1M,而且这个binder通信是系统整个的,

    wust小吴

扫码关注云+社区

领取腾讯云代金券