当前位置: 首页 > news >正文

进程间通信(IPC)-管道、消息队列、信号量、共享存储、socket

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC的方式通常有管道(包括无名管道PIPE和命名管道FIFO)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

一、管道

1、无名管道(PIPE)

特点:半双工、只用于亲缘进程间(父子、兄弟进程)、是一种特殊的文件只存在于内存中

int pipe(int fd [2]);

操作系统自动分配的临时匿名文件描述符用于读和写,fd[0]读   fd[1]写

要关闭管道只需将两个文件描述符关闭即可 close(fd[0/1]);

2、命名管道(fifo)

特点:全双工,在无关进程间,存在于文件系统

int mkfifo(const char *path,mode_t mode);

无名管道和命名管道都属于Unix/Linux下的进程间通信(IPC)手段,但它们有着明显的区别:

    1.    使用范围:无名管道只能在同一台机器上的父子进程或兄弟进程之间使用;而命名管道可以在不相关的进程或者不同机器上进程之间使用。
    2.    生命周期:无名管道随进程产生而产生,随进程消亡而消亡;命名管道是一直存在的,只要不手动删除它,它就会一直存在下去。
    3.    访问方式:无名管道不能直接用文件名来访问,而只能由一个进程向其写入数据,另一个进程从其中读取数据;而命名管道可以用文件名来访问,任何进程只要知道文件名就可以对其进行读写操作。
    4.    数据缓存:无名管道中的数据不是立即写入的,而是会暂时保存在一个缓冲区中,只有当缓冲区满或者达到一定的时间间隔才会真正写入磁盘;而命名管道中的数据则是立即写入的,不会被缓存。
    5.    数据传输效率:无名管道的数据传输效率比较高,因为它只需要一次系统调用就能完成一次数据传输;而命名管道的数据传输效率较低,因为它需要两次系统调用才能完成一次数据传输。

总的来说,无名管道更加简单易用,适合简单的进程间通信需求,而命名管道功能更加强大,适用于复杂多变的进程间通信需求。

二、消息队列

概念:一种在消息的传输过程中保存消息的容器。它主要用于应用程序之间的数据交换,可以实现在两个或更多应用程序之间进行可靠的异步数据传输。消息队列是一个简单的基于队列的存储和转发系统。它的核心思想是采用队列作为缓冲区,在应用程序之间传递消息。这样可以减轻应用程序之间的耦合度,使得应用程序之间的数据交换变得更加容易。

#include <sys/msg.h>
// 创建或打开消息队列:成功返回队列ID,失败返回-1
int msgget(key_t key, int flag);
// 添加消息:成功返回0,失败返回-1
int msgsnd(int msqid, const void *ptr, size_t size, int flag);
// 读取消息:成功返回消息数据的长度,失败返回-1
int msgrcv(int msqid, void *ptr, size_t size, long type,int flag);
// 控制消息队列:成功返回0,失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

  • 异步处理:消息队列可以使应用程序以异步方式进行数据交换,从而使应用程序能够更好地处理并发请求和响应。
  • 解耦:消息队列将应用程序之间的直接依赖关系解耦,使它们之间的交互变得更加简单和灵活。
  • 可靠性:消息队列提供了一种可靠的数据传输机制,可以确保消息不会丢失或损坏,并且可以根据需要进行备份和恢复。
  • 弹性扩展:消息队列可以轻松地进行扩展,以满足不断增加的负载需求。
  • 高性能:消息队列可以提供很高的性能,以满足实时和大数据应用的需求。
  • 安全:消息队列提供了一些安全机制,可以保护敏感数据免受攻击和泄露。
  • 跨平台:消息队列支持多种操作系统和开发语言,可以跨平台进行部署和使用

三、共享内存

共享内存(Shared Memory)是指多个进程可以访问的同一段物理内存空间。这是一种进程间通信 (IPC) 的技术,可以让多个进程在同一块内存区域上进行数据共享
共享内存的优点在于速度快,效率高,而且可以直接访问,而不用经过复杂的传递过程。但是,由于所有进程都可以直接访问同一块内存区域,所以可能会出现数据竞争的问题,因此需要适当的同步和互斥手段来防止这种情况发生。
共享内存通常用于实现线程间的通信,或者在一台机器上的多个进程之间进行数据交换。

 #include <sys/shm.h>
// 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1
int shmget(key_t key, size_t size, int flag);
 // 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
void *shmat(int shm_id, const void *addr, int flag);
// 断开与共享内存的连接:成功返回0,失败返回-1
int shmdt(void *addr);
 // 控制共享内存的相关信息:成功返回0,失败返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

  1. 高速:共享内存的速度非常快,因为它省去了拷贝数据的过程,可以直接访问内存中的数据。
  2. 高效:由于共享内存可以被多个进程共享,因此减少了资源的消耗,提高了程序运行效率。
  3. 直接访问:进程可以通过指针直接读取或修改共享内存中的数据,而不需要通过任何中间媒介。
  4. 复杂性:共享内存需要程序员自己负责同步和互斥问题,这增加了编程的复杂性。
  5. 限制:共享内存只能在同一台计算机上使用,不能跨越网络。
  6. 安全:如果一个进程意外崩溃,那么其他进程可能无法继续正常工作。因此,需要使用适当的安全机制来保护共享内存。

 四、信号量

信号量(Semaphore)是一种控制并发进程数量的方法。它是一个计数器,可以用来控制多个进程同时访问共享资源的数量。通常情况下,当信号量的值大于0时,允许一个进程访问共享资源;否则,该进程会被阻塞,直到信号量的值再次变为正数。
信号量通常由操作系统内核维护,可以在用户模式下进行控制。例如,在Unix/Linux系统中,可以用open(), semop(), semctl()等函数来进行信号量的操作。
信号量的优点在于简单、直观、易于理解,并且能够在多线程或多进程环境中实现有效的同步控制。但是,由于信号量无法检测死锁情况,所以在使用时需要特别注意。
下面是关于信号量的一些常用术语:

  * 初始化:初始化信号量的值,通常是正整数。
  * P操作:每次P操作都会把信号量减1。当信号量为0时,该进程会被阻塞,直到有其他进程释放资源,将其加1。
  * V操作:每次V操作都会把信号量加1。当信号量为0时,会唤醒一个正在等待的进程。

信号量是一种常用的进程间通信方式,可用于实现互斥、同步等问题

相关文章:

进程间通信(IPC)-管道、消息队列、信号量、共享存储、socket

进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。 IPC的方式通常有管道&#xff08;包括无名管道PIPE和命名管道FIFO&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持…...

「Verilog学习笔记」使用generate…for语句简化代码

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 generate…for语句是Verilog HDL语言特有的语句&#xff0c;使用循环结构编写可综合的多个形式相近的代码&#xff0c;循环变量必须由特定关键字genvar声明。 timesca…...

互联网Java工程师面试题·Spring篇·第七弹

目录 36、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子. 37、什么是基于注解的容器配置? 38、怎样开启注解装配&#xff1f; 39、Required 注解 40、Autowired 注解 41、Qualifier 注解 42、在 Spring 框架中如何更有效地使用 JDBC? 43、JdbcTemplate 44…...

mysql驱动包引起的告警问题using SSL the verifyServerCertificate property is set to ‘false‘

tomcat启动时报以下ssl的连接错误&#xff0c;mysql版本为5.7.17&#xff0c;虽然系统可以使用&#xff0c;但是日志量太大&#xff0c;还是处理下&#xff0c;只需要修改mysql的连接格式&#xff1a; url.db “jdbc:mysql://localhost:3306/disis3?userroot&passwordXXXX…...

draw.io与项目管理——如何利用流程图工具提高项目管理效率

draw.io 是一款强大的图形绘制工具&#xff0c;用于创建各种类型的图表、流程图、组织结构图、网络图和平面设计等。它提供了丰富的绘图工具和预定义的图形库&#xff0c;使用户能够轻松创建专业水平的图形作品。 draw.io具有直观的界面和简单易用的功能&#xff0c;适合各种用…...

LoRaWAN物联网架构

与其他网关一样&#xff0c;LoRaWAN网关也需要在规定的工作频率上工作。在特定国家部署网关时&#xff0c;必须要遵循LoRa联盟的区域参数。不过&#xff0c;它是没有通用频率的&#xff0c;每个国家对使用非授权MHZ频段都有不同的法律规定。例如&#xff0c;中国的LoRaWAN频段是…...

数据结构(五):哈希表及面试常考的算法

一、哈希表介绍 1、定义 哈希表&#xff0c;也叫散列表&#xff0c;是根据关键码和值 (key和value) 直接进行访问的数据结构&#xff0c;通过key和value来映射到集合中的一个位置&#xff0c;这样就可以很快找到集合中的对应元素。例如&#xff0c;下列键(key)为人名&#xf…...

水利部加快推进小型水库除险加固,大坝安全监测是重点

国务院常务会议明确到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 为加快推进小型水库除险加固前期工作&#xff0c;水利部协调财政部提前下达了2023年度中央补助…...

实施电子采购的6个有效步骤

耗时又费力&#xff0c;手动采购之苦相信大家都受够了&#xff0c;现在越来越多的企业正在实施电子采购策略。根据CIPS的《2022年采购与供应数字化报告》&#xff0c;多达95%的企业在采购与供应商管理中采用了技术。 但采用技术并不能保证立竿见影的效果。企业需要制定好电子采…...

【Shell脚本6】Shell 运算符

Shell 基本运算符 Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算术运算符关系运算符布尔运算符逻辑运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c;例如 awk 和 …...

设计模式之保护性暂停

文章目录 1. 定义2. 实现保护性暂停模式3. Join原理4. 保护性暂停模式的扩展 1. 定义 即Guarded Suspension&#xff0c;用在一个线程等待另一个线程的执行结果。 有一个结果需要从一个线程传递给另一个线程&#xff0c;让他们关联到同一个GuarderObject&#xff08;这就是保…...

UE5、CesiumForUnreal实现加载GeoJson绘制单面(Polygon)功能(StaticMesh方式)

文章目录 1.实现目标2.实现过程2.1 实现原理2.1.1 数据读取2.1.2 三角剖分2.1.3 创建StaticMesh2.2 应用测试2.2.1 具体代码2.2.2 蓝图应用测试3.参考资料1.实现目标 通过读取本地GeoJson数据,在UE中以StaticMeshComponent的形式绘制出面数据,支持Editor和Runtime环境,GIF动…...

Linux 下以其他用户运行程序

需求&#xff1a; 在root的用户下&#xff0c;设置开启自启&#xff0c;这些服务都要用一个swadmin用户运行。 1、创建需要执行的命令脚本 vim /usr/local/bin/start_services.sh#!/bin/bash runuser -l swadmin -c cd /opt/server/ && ./service.sh start s-app-ser…...

Centos7下安装使用K3S

## K3S简介 K3S官方文档链接 K3s是一个轻量级的、专为容器化应用和Kubernetes集群设计的开源Kubernetes发行版。K3s的目标是提供一个更小、更简单、更易于部署和维护的Kubernetes集群。它是Rancher Labs开发的一个项目&#xff0c;旨在满足边缘计算、IoT设备、开发和测试环境…...

易云维®工厂能耗管理平台系统方案,保证运营质量,推动广东制造企业节能减排

我国《关于完整准确全面贯彻新发展理念推进碳达峰碳中和工作的实施意见》出台&#xff0c;提出了推进碳达峰碳中和工作的总体目标。到2025年&#xff0c;广东具备条件的地区、行业和企业率先实现碳达峰&#xff0c;为全省实现碳达峰、碳中和奠定坚实基础&#xff1b;2030年前实…...

Qwt QwtWheel绘制滚动轮

1.简介 QwtWheel 是一个用于实现滚动轮控件的类库。它基于 Qt 框架&#xff0c;并提供了一些方便的功能来处理滚动轮的事件和绘图。 QwtWheel 类继承自 QWidget类&#xff0c;用于定义滚动轮控件的通用行为。QwtWheel 添加了特定于滚动轮的功能。 QwtWheel 可以用于创建具有滚…...

【C++语法讲解】 | 运算符重构 | 三种运算符的重构方式 |代码演示

文章目录 1&#xff0c;简述2&#xff0c;结构体的定义1&#xff0c;结构体的声明2&#xff0c;结构体的申请 3.1 &#xff0c;在结构体中重构3.2 在结构体外进行重构 1&#xff0c;简述 通常情况下&#xff0c;我们会创建一些简单的数据结构以应对日常的算法使用&#xff0c;…...

[100天算法】-寻找峰值(day 63)

题目描述 峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums&#xff0c;其中 nums[i] ≠ nums[i1]&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个峰值所在位置即可。你可以假设 nums[-1] nums[n…...

Go语言开发环境安装,hello world!

1. Go开发包SDK https://golang.google.cn/dl/&#xff08;国内也可以安装&#xff09; 根据自己电脑下载对应的安装包&#xff0c;我懒下载了msi安装 然后一路点确定安装Go 2.安装GoLand https://www.jetbrains.com/go/download/#sectionwindows 下载安装包 一路确定安装完…...

记CVE-2022-39227-Python-JWT漏洞

文章目录 前言影响版本漏洞分析Newstar2023 Week5总结 前言 在Asal1n师傅的随口一说之下&#xff0c;说newstar week5出了一道祥云杯一样的CVE&#xff0c;于是自己也是跑去看了一下&#xff0c;确实是自己不知道的一个CVE漏洞&#xff0c;于是就从这道题学习到了python-jwt库…...

软件测试/测试开发丨如何利用ChatGPT自动生成测试用例思维导图

点此获取更多相关资料 简介 思维导图是一种用图形方式表示思维和概念之间关系的工具&#xff1a; 有些公司会使用思维导图编写测试用例&#xff0c;这样做的优点是&#xff1a; 1.可视化和结构化。 2.易于理解&#xff0c;提高效率。 而 ChatGPT 是无法直接生成 xmind 格式…...

【编程语言发展史】Unity开发语言的历史发展

Unity开发前期版本时&#xff0c;使用的是一种名为UnityScript的类似JavaScript的语言。然而&#xff0c;随着时间的推移&#xff0c;开发者社区大多数人都倾向于使用C#进行开发&#xff0c;Unity决定将重点放在C#上&#xff0c;因为C#具有更强大的生态系统、更好的性能和更广泛…...

springboot http添加请求头 添加请求证书

首先明确两个事情&#xff1a;请求对象&#xff0c;连接对象 我们知道你要是想发起一个请求&#xff0c;需要指定两个环节内容&#xff0c;一个是请求内容对象(request)&#xff0c;一个是连接内容对象(httpClient) 它们两个的作用我们在下面会看到 简要分析源码 1.先说一下…...

【Qt之数据库操作】

使用Qt实现SQLite数据库操作可以分为以下几个步骤&#xff1a; 添加SQLite头文件和库文件&#xff1a; 在Qt项目中&#xff0c;需要在.pro文件中添加以下内容&#xff1a; QT sql打开/创建数据库&#xff1a; 可以使用QSqlDatabase类中的静态函数addDatabase()来添加数据库…...

数据结构(c语言版) 队列

链队列 要求&#xff1a;实现链队列的创建、初始化、入队、出队 &#xff08;先进先出&#xff09; 代码 // // Created by My.cy on 2023/10/19. // //链队列 创建、初始化、入队、出队 先进先出#include <stdio.h> #include <malloc.h>//定义结构体 struct…...

kimera论文阅读

文章目录 功能构成&#xff1a;Kimera线程A. Kimera-VIO:B. Kimera-RPGO:C. Kimera-Mesher:D. Kimera-Semantics:E.调试工具 功能构成&#xff1a; Kimera包括四个关键模块: Kimera-VIO的核心是基于gtsam的VIO方法[45]&#xff0c;使用IMUpreintegration和无结构视觉因子[27]…...

golang gorm通过泛型实现通用单表增删改

golang gorm通过泛型实现通用单表增删改 无废话&#xff0c;直接上代码 想实现通用&#xff0c;首先得实现查询的通用&#xff0c;可以用传递map实现 func Where(where map[string]interface{}) func(db *gorm.DB) *gorm.DB {return func(db *gorm.DB) *gorm.DB {dbTmp : db…...

十、K8S之ConfigMap

ConfigMap 一、概念 在K8S中&#xff0c;ConfigMap是一种用于存储配置数据的API对象&#xff0c;一般用于存储Pod中应用所需的一些配置信息&#xff0c;或者环境变量。将配置于 Pod 分开&#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。 二、创建 可以使用 ku…...

python飞书群机器人通过webhook发送消息

python飞书群机器人通过webhook发送消息 import json import loggingimport requestslogger logging.getLogger(__name__) logging.basicConfig(levellogging.DEBUG)class FeishuTalk:"""飞书群机器人通过webhook发送消息"""def __init__(self…...

埃隆·马斯克的 AI 聊天机器人 Grok 已经上线

昨天&#xff0c;埃隆马斯克 (Elon Musk) 通过他的公司 xAI 推出了一款名为 Grok 的新型人工智能聊天机器人。这款新的聊天机器人将通过 Twitter 更新实时获取世界知识&#xff0c;使其成为最新的对话 AI 系统。 Grok 的独特和基本优势在于它可以通过 &#x1d54f; 平台实时了…...