Linux进程间通信(消息队列)

这篇具有很好参考价值的文章主要介绍了Linux进程间通信(消息队列)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可以用命令“ipcs”查看三种 IPC,“ipcrm”删除 IPC 对象。在 i.MX6ULL 终结者开发板终端输入“ipcs” 查看系统中存在的 IPC 信息: 

Linux进程间通信(消息队列)

这些 IPC 对象存在于内核空间,应用层使用 IPC 通信的步骤为: 

 Linux进程间通信(消息队列)

 1. 获取 key 值,内核会将 key 值映射成 IPC 标识符,获取 key 值常用方法:

(1)在 get 调用中将 IPC_PRIVATE 常量作为 key 值。

(2)使用 ftok()生成 key

2. 执行 IPC get 调用,通过 key 获取整数 IPC 标识符 id,每个 id 表示一个 IPC 对 

Linux进程间通信(消息队列) 3. 通过 id 访问 IPC 对象。

Linux进程间通信(消息队列)Linux进程间通信(消息队列)

 4. 通过 id 控制 IPC 对

Linux进程间通信(消息队列)

 文章来源地址https://www.toymoban.com/news/detail-467296.html

创建这三种 IPC 对象都要先获取 key 值,然后根据 key 获取 id,用到的函数如下:

Linux进程间通信(消息队列)

 下面介绍消息队列:

消息队列是类 unix 系统中一种数据传输的机制,其他操作系统中也实现了这种机制,可见这种通信机 制在操作系统中有重要地位。

Linux 内核为每个消息队列对象维护一个 msqid_ds,每个 msqid_ds 对应一个 id,消息以链表形式存储, 并且 msqid_ds 存放着这个链表的信息。

Linux进程间通信(消息队列)

消息队列的特点:

1.发出的消息以链表形式存储,相当于一个列表,进程可以根据 id 向对应的“列表”增加和获取消息。

2.进程接收数据时可以按照类型从队列中获取数据。

消息队列的使用步骤:

1. 创建 key;

2. msgget()通过 key 创建(或打开)消息队列对象 id; 3. 使用 msgsnd()/msgrcv()进行收发; 4. 通过 msgctl()删除 ipc 对象

通过 msgget()调用获取到 id 后即可使用消息队列访问 IPC 对象,消息队列常用 API 如下

Linux进程间通信(消息队列)

Linux进程间通信(消息队列)

Linux进程间通信(消息队列)

Linux进程间通信(消息队列)

 实验代码

msgsend.c  向消息队列里面写

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
    long mtype;
    char mtext[128];
};

int main(void)
{
    int msgid;
    key_t key;
    struct msgbuf msg;
    // 获取 key 值
    key = ftok("./a.c", 'a');
    // 获取到 id 后即可使用消息队列访问 IPC 对象
    msgid = msgget(key, 0666 | IPC_CREAT);
    if (msgid < 0)
    {
        printf("msgget is error\n");
        return -1;
    }
    printf("msgget is ok and msgid is %d \n", msgid);
    msg.mtype = 1;
    strncpy(msg.mtext, "hello", 5);
    // 发送数据
    msgsnd(msgid, &msg, strlen(msg.mtext), 0);
    return 0;
}

msgread.c 从消息队列里面读

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
struct msgbuf
{
    long mtype;
    char mtext[128];
};
int main(void)
{
    int msgid;
    key_t key;
    struct msgbuf msg;
    key = ftok("./a.c", 'a');
    // 获取到 id 后即可使用消息队列访问 IPC 对象
    msgid = msgget(key, 0666 | IPC_CREAT);
    if (msgid < 0)
    {
        printf("msgget is error\n");
        return -1;
    }
    printf("msgget is ok and msgid is %d \n", msgid);
    // 接收数据
    msgrcv(msgid, (void *)&msg, 128, 0, 0);
    printf("msg.mtype is %ld \n", msg.mtype);
    printf("msg.mtext is %s \n", msg.mtext);
    return 0;
}

在 Ubuntu 上开一个终端,编译运行如下图所示:

Linux进程间通信(消息队列)

 

到了这里,关于Linux进程间通信(消息队列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux进程间通信 - 信号(signal) 与 管道(pipe) 与 消息队列

    什么是进程间通信,就是进程与进程之间进行通信,互相发送消息;可以通过 信号 或者 管道 或者 消息队列 或者 信号量 去通信! 目录 一、信号 1. 信号简介  2. 都有那些信号? 3. 注册信号的函数 1). signal 2). sigaction (项目中强烈推荐使用) 4. 信号发送 1). kill 函数 2). alarm 函

    2024年02月01日
    浏览(38)
  • 【Linux】进程间通信——system V共享内存 | 消息队列 | 信号量

    共享内存是一种在多个进程之间进行进程间通信的机制。它允许多个进程访问相同的物理内存区域,从而实现高效的数据交换和通信。 因为 进程具有独立性(隔离性) ,内核数据结构包括对应的代码、数据与页表都是独立的。OS系统为了让进程间进行通信,必须让不同的进

    2024年02月15日
    浏览(51)
  • Linux之进程间通信——system V(共享内存、消息队列、信号量等)

    本文介绍了另一种进程间通信——system V,主要介绍了共享内存,消息队列、信号量,当然消息队列了信号量并非重点,简单了解即可。 共享内存 :不同的进程为了进行通信看到的同一个内存块,该内存块被称为共享内存。 进程具有独立性,它的内核数据结构包括对应的代

    2024年02月08日
    浏览(59)
  • 进程间通信 + 消息队列

    每个进程有各自不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1吧数据从用户空间考到内核缓冲区,进程2再从内核缓冲区吧数据读走,内核提供的这种机制成为进程间通信 管

    2024年02月09日
    浏览(33)
  • 【linux】进行间通信——共享内存+消息队列+信号量

    进程间通信方式目前我们已经学了匿名管道,命名管道。让两个独立的进程通信,前提是看到同一份资源。匿名管道适用于血缘关系的进程,一个打开写端一个打开读端实现的。命名管道适用于完全独立的进程,打开同一份文件实现的。 接下来我们看看剩下的实现进程间通信

    2024年02月05日
    浏览(45)
  • 【Linux查看进程和日志的命令】

    Linux 中可以使用以下命令来查看进程和日志: 可以使用 ps 和 top 命令来查看正在运行的进程,两者的区别在于 ps 命令是一次性显示所有进程信息,而 top 命令可以实时显示进程信息,包括 CPU 使用率、内存占用率等。 例如,使用 ps aux 命令可以显示所有进程的详细信息,包括

    2024年02月13日
    浏览(41)
  • Linux -- 查看进程 top命令 详解

    我们上篇介绍了, Linux 中的进程等概念,那么,在Linux 中如何查看进程呢 ?? 我们常用到的有两个命令, PS 和 top 两个命令,今天先来介绍下 top 命令~! 主要是 交互式的,动态 的显示 进程信息~!!! 语法 : top [ -d 数字 ] [ 选项 ] 选项 : -d : 后面可以接秒数,就是整个

    2024年02月07日
    浏览(48)
  • Linux 查看进程ps命令详解

    ps 命令是 Linux 系统中常用的进程查看工具,它可以查看当前系统中正在运行的进程信息。ps 命令可以显示进程的 ID、状态、执行命令、占用内存等信息,对于系统管理员来说,使用 ps 命令可以方便地监控和管理系统中的进程。 ps 命令的基本语法如下: 常用的选项包括: 选

    2024年02月14日
    浏览(56)
  • Linux基础命令-ps查看进程状态

    Linux基础命令-sort内容排序 Linux基础命令-chattr更改文件隐藏属性 文章目录 前言 一 命令的介绍 二 语法及参数 2.1 通过help和man查看命令的语法 2.2 命令参数 2.3 常用参数 三 参数使用与内容含义 3.1 查看系统当中所有的数据 3.1.1 ps aux中状态栏的含义 3.1.2 STAT进程状态各自代表的含

    2024年02月03日
    浏览(46)
  • Linux ps命令:查看正在运行的进程

    ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令的基本格式如下: [root@localhost ~]# ps aux #查看系统中所有的进程,使用 BS 操作系统格式 [root@localhost ~]# ps -le #查看系统中所有的进程,使用 Linux 标准命令格式  选项: a:显示一

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包