进程间通信 + 消息队列

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

进程间通信

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

管道

管道是一种最基本的ipc机制,由pipe函数创建

#include<unistd.h>

int pipi(int filedes[2])

调用pipe函数时在内核开辟一块缓冲区(管道)用于通信,它有一个读端和一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(就像0是标准输入,1是标准输出一样)。

消息队列

系统内维护了一个存放消息的队列,不同用户可以向队列中发送消息,或者从队列中接收消息

#include<sys/types.h>

#include<sys/ipc.h>

#include<msg.h>

int msgget(key_t key,int msgflg);

int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

ssizet msgrcv(int msqid,void *msgp,sizet msgsz,long msgtyp,int msgflg);

进程间通信 + 消息队列

消息队列实例

System V消息队列是一种在Linux系统中实现消息队列的方式,它可以在进程间传递消息。下面是一个使用System V消息队列的简单示例:

  1. 创建消息队列
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main()
{
    key_t key;
    int msgid;

    key = ftok("msgq.txt", 'A');
    msgid = msgget(key, IPC_CREAT | 0666);
    return 0;
}

  1. 发送消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>

struct message {
    long mtype;
    char mtext[100];
};

int main()
{
    key_t key;
    int msgid;
    struct message msg;

    key = ftok("msgq.txt", 'A');
    msgid = msgget(key, 0666);
    msg.mtype = 1;
    strcpy(msg.mtext, "Hello Message Queue!");
    msgsnd(msgid, &msg, sizeof(msg), 0);
    return 0;
}

  1. 接收消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

struct message {
    long mtype;
    char mtext[100];
};

int main()
{
    key_t key;
    int msgid;
    struct message msg;

    key = ftok("msgq.txt", 'A');
    msgid = msgget(key, 0666);
    msgrcv(msgid, &msg, sizeof(msg), 1, 0);
    printf("%s\n", msg.mtext);
    return 0;
}

这个示例中,我们使用了 msgget() 函数创建了一个消息队列,使用 msgsnd() 函数向消息队列中发送了一条消息,使用 msgrcv() 函数从消息队列中接收了一条消息并打印出来。文章来源地址https://www.toymoban.com/news/detail-488049.html

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

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

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

相关文章

  • 【Linux】进程间通信 --- 管道 共享内存 消息队列 信号量

    等明年国庆去西藏洗涤灵魂,laozi不伺候这无聊的生活了 1. 通过之前的学习我们知道,每个进程都有自己独立的内核数据结构,例如PCB,页表,物理内存块,mm_struct,所以具有独立性的进程之间如果想要通信的话,成本一定是不低的。 2. a.数据传输:一个进程需要将它的数据

    2023年04月17日
    浏览(46)
  • 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)
  • Laravel 队列监听Superviso进程管理(消息队列后台监听)

    在 Ubuntu 系统上,可以使用以下命令安装 Supervisor: 在CentOS: 安装完成后,Supervisor 的配置文件会被放置在  /etc/supervisor/conf.d/  目录下 在  /etc/supervisor/conf.d/  目录下创建一个新的配置文件,例如  laravel-worker.conf : 编辑配置文件: 在打开的文件中,添加以下配置: 运行以

    2024年02月02日
    浏览(33)
  • Qt共享内存实现进程间消息队列

    在Qt 5.9中,可以使用Qt的跨进程通信机制来实现进程间的消息队列。这个机制是通过Qt的QSharedMemory、QSystemSemaphore和QSharedMemory类来实现的。 首先,你需要创建一个消息队列的服务器端和客户端。服务器端负责接收和处理消息,客户端负责发送消息。 服务器端的代码示例如下:

    2024年02月09日
    浏览(40)
  • 消息队列(11) - 通信协议的设计

    对于我们客户端与服务器之间的通信协议我们约定如下: 具体的协议设计: 之后我们传递的参数也是这些 关于 type其实是在描述当前这个请求 、 响应是在调用那个API 约定如下 对于channel ,是tcp链接中的一个逻辑上的链接,一个TCP可以有多个Channel,存在的意义是为了让TCP得到复用

    2024年02月13日
    浏览(31)
  • 项目实战 — 消息队列(8){网络通信设计①}

    目录 一、自定义应用层协议 🍅 1、格式定义 🍅 2、准备工作 🎄定义请求和响应   🎄 定义BasicArguments 🎄 定义BasicReturns 🍅 2、创建参数类         🎄 交换机         🎄 队列         🎄 绑定         🎄发布消息         🎄 订阅消息         🎄确认应答

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

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

    2024年02月05日
    浏览(45)
  • 在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

    Python 自带的多进程库 multiprocessing 可实现多进程。我想用这些短例子示范如何优雅地用多线程。中文网络上,有些人只是翻译了旧版的 Python 官网的多进程文档。而我这篇文章会额外讲一讲下方加粗部分的内容。 创建进程 Process, fork 直接继承资源,所以初始化更快,spawn 只

    2024年02月16日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包