Unix进程间通信之简介-总体概述和引子

目录标题

  • 0. 前言
  • 1. 概述
  • 2. 进程、线程与信息共享
  • 3. IPC对象的持续性
  • 4. 名字空间
  • 5. fork、exec和exit对IPC对象的影响
  • 6. 出错处理: 包裹函数
  • 7. Unix标准
  • 8. 小结

0. 前言


进程间通信这块是学习linux-c编程的关键, 这篇为后续进程间通信技术的引子篇,后续讲到单独的某一个系统调用 都附该引用。

1. 概述


IPC是进程间通信(interprocess communication)的简称。系统上不同进程之间消息传递(message passing)的方式。
共享内存需要某种实行的
同步
(synchronization)参与运作。

发展阶段。

  • 管道(pipe) 是第一个广泛使用的IPC形式, 使用在Kernel之上的(应用程序或shell)。

    • 问题在于智能父子进程之间使用。
    • 解决方案是FIFO(无名管道)。
  • System V消息队列(System V message queue)

    • 用在同一主机上有亲缘关系或无亲缘关系的进程之间。
    • 大多数版本的Unix都支持。

    有亲缘关系不仅指父子,还包含子子关系,比如fork两次,派生2个子进程。
    所有Unix进程与init进程都有亲缘关系。

  • Posix消息队列

  • 远程过程调用(Remote Procedure Call, RPC)

    • 20世纪80年代中期,它是从一个系统(客户端主机)上某个程序调用另外一个系统(服务器主机)上某个函数的一种方法,是作为显式网络编程的一种替代方法开发的。

同步演变

  • 需要某种同步形式(往往是为了防止多个进程同时修改同一文件)的早期程序使用了文件系统的诡秘特性。
  • 记录上锁(record locking) 1988年由Posix.1标准化。
  • System V信号量(System V semaphore)是System V消息队列加上System V内核的同事伴随System V共享内存(System V shared memory)加入的。
  • Posix信号量(Posix semaphore)和Posix共享内存也由Posix实时标准加入。
  • 互斥锁(mutex)和条件变量(condition variable)是由Posix线程标准定义的两种同步形式。尽管往往用于线程间的同步,他们也能提供不同进程间的同步。
  • 读写锁(read-write lock)是另一种形式的同步。

2. 进程、线程与信息共享


在这里插入图片描述

按照传统的Unix编程模型,我们在一个系统上运行多个进程,每个进程都有各自的地址空间。Unix进程间的信息共享可以有多个方式:
1)左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息,每个进程都得穿越内核(例如read,write, lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样即可保护多个写入者,防止相互干扰,也可保护一个或多个读出者,防止写入者的干扰。
2)中间的两个进程共享驻留于内核中的某些信息。管道是这种共享类型的一个例子,System V消息队列和System V 信号量也是。现在访问共享信息的每次操作涉及对内核的一次系统调用。
3)右边的两个进程有一个双方都能访问的共享内存区。每个进程一旦设置好该共享内存区,就能根本不涉及内核而访问其中的数据。共享该内存区的进程需要某种形式的同步。
注意没有任何东西限制任何IPC技术只能使用两个进程。我们讲述的技术适用于任意数目的进程。

线程
虽然Unix系统中进程的概念已使用很久,一个给定进程中多个线程(thread)的概念却相对较新。Posix.1线程标准 (称Pthreads)是于1995年通过的。从IPC角度看来,一个给定进程内的所有线程共享同样的全局变量。
然而我们必须关注的是各个线程间对全局数据的同步访问。同步尽管不是一种明确的IPC形式,但它确实伴随许多形式的IPC使用, 以控制对某些共享数据的访问。

3. IPC对象的持续性


我们可以把任意类型的IPC的持续性(persistence)定义成该类型的一个对象一直存在多长时间。以下展示了三种类型的持续性。
在这里插入图片描述

  • 随进程持续的(process-persistent) , 例如管道和FIFO就是这种对象。
  • 随内核持续的(kernel-persisten) 例如System V的消息队列,信号量和共享内存区就是该类对象。Posix的消息队列,信号量和共享内存必须至少是随内核持续的,但也可以是随文件系统持续的,具体取决于实现。
  • 随文件系统持续的(filesystem-persistent)。 Posix消息队列,信号量和共享内存如果是使用映射文件实现的(不是必需条件),那么他们就是随文件系统持续的。
    在定义一个IPC对象的持续性时我们必须小心,因为它并不总是像看起来的那样。例如管道内的数据是在内核中维护的,但管道具备的是随进程的持续性而不是随内核的持续性:最后一个将某个管道打开着用于读的进程关闭该管道后,内核将丢弃所有的数据并删除该管道。类似的,尽管FIFO在文件系统中有名字,他们也只是具备随进程的持续性,因为最后一个将某个FIFI打开着的进程关闭该FIFI后,FIFI中的数据将被丢弃。
IPC类型持续性
管道随进程
FIFO随进程
Posix互斥锁随进程
Posix条件变量随进程
Posix读写锁随进程
fcntl记录锁随进程
Posix消息队列随内核
Posix有名信号量随内核
Posix基于内存的信号量随进程
Posix共享内存区随内核
System V消息队列随内核
System V信号量随内核
System V共享内存区随内核
TCP套接字随进程
UDP套接字随进程
Unix域套接字随进程

注意该列表中没有任何类型的IPC具备随文件系统的持续性,但是我们说过有三种类型的Posix IPC可能会具备该持续性, 这取决于它们的实现。显然,向一个文件写入数据提供了随文件系统的持续性,但这通常不作为一种IPC形式使用。多数形式的IPC并没有在系统重新自举后继续存在的打算,因为进程不可能跨越重新自举继续存活。对于一种给定形式的IPC,要求它具备随文件系统的持续性可能会将其性能降低,而IPC的一个基本的设计目标是高新能。

4. 名字空间


  • 当两个或多个无亲缘关系的进程使用某种类型的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字或标识符,这样其中一个进程(往往是服务器)可以创建该IPC对象,其余进程则可以指定同一个IPC对象。
  • 管道没有名字,因为不能用于无亲缘关系的进程间,但是FIFO有一个在文件系统中的Unix路径名作为其标识符(因此可用于无亲缘关系的进程间)。对于一种给定的IPC类型,其可能的名字的集合称为它的名字空间。名字空间非常重要,因为对于除普通管道以外的所有形式的IPC来说,名字是客户与服务器彼此连接以交换消息的手段。
IPC类型用于打开或创建IPC的名字空间IPC打开后的标识Posix.1 1996Unix98
管道没有名字描述符**
FIFO路径名描述符**
Posix互斥量没有名字pthread_mutex_t指针**
Posix条件变量没有名字pthread_cond_t指针**
Posix读写锁没有名字pthread_rwlock_t指针*
fcntl记录上锁路径名描述符**
Posix消息队列Posix IPC名字mqd_t值**
Posix有名信号量Posix IPC名字sem_t指针**
Posix基于内存的信号量没有名字sem_t指针**
Posix共享内存区Posix IPC名字描述符**
System V消息队列key_t键System V IPC标识符*
System V 信号量key_t键System V IPC标识符*
System V共享内存区key_t键System V IPC标识符*
路径名描述符
Sun RPC程序/版本RPC句柄
TCP套接字IP地址与端口描述符.1g*
UDP套接字ip和端口描述符.1g*
Unix域套接字路径名描述符.1g*

尽管Posix.1标准化了信号量,他们依然是可选的。

5. fork、exec和exit对IPC对象的影响


6. 出错处理: 包裹函数


7. Unix标准


8. 小结


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/256499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【 USRP安装教程】MATLAB 2023B

步骤 matlabdocusrp驱动包 doc 安装包内容列表 双击“R2023b_Doc_Windows.iso” 打开cmd 查看盘符 切换盘符 因为是F盘,所以cmd输入:“F:” F:进入可安装界面 cd F:\bin\win64安装离线文档库 .\mpm install-doc --matlabroot"C:\MATLAB\R202…

普冉(PUYA)单片机开发笔记(11): I2C通信-配置主从收发

概述 在上一篇《普冉(PUYA)单片机开发笔记(10): I2C通信-配置从机-CSDN博客》配置了 PY32F003 的 I2C 从机一侧,今天配置主机,并实现主-从机之间的报文收发。 为了完成这个实验,需要两块 PY32F003F18P 的开发板&…

git 删除仓库中多余的文件或者文件夹

问题 在项目开发测试阶段,将无意间将本地敏感的、或无用的文件或目录不小心提交到远程仓库了的问题。 解决方案 第一步:同步代码 先pull远程代码,保持同步。 git pull 第二步:删除文件 // 删除单个文件git rm 文件名 --cached/…

opencv 入门一(显示一张图片)

头文件添加如下&#xff1a; 库目录添加如下&#xff1a; 依赖的库如下&#xff1a; #include <iostream> #include "opencv2/opencv.hpp" int main(int argc,char ** argv) { cv::Mat img cv::imread(argv[1], -1); if (img.empty()) return -1; …

[C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/weixin_43197380&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 Loewen丶原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&…

APS54085 高辉度调光降压恒流芯片 PWM 线性调光 车灯IC

产品描述 APS54085 是一款 PWM 工作模式,简单、内置功率 MOS 管&#xff0c;适用于 5-100V输入的高精度降压 LED 恒流驱动芯片。电流2.0A。APS54085 可实现线性调光和 PWM 调光&#xff0c;线性调光有效电压范围 0.52-2.55V.PWM 调光频率范围 100HZ-30KHZ。APS54085 工作频率可…

MATLAB - Gazebo 仿真环境

系列文章目录 前言 机器人系统工具箱&#xff08;Robotics System Toolbox™&#xff09;为使用 Gazebo 模拟器可视化的模拟环境提供了一个界面。通过 Gazebo&#xff0c;您可以在真实模拟的物理场景中使用机器人进行测试和实验&#xff0c;并获得高质量的图形。 Gazebo 可在…

鸿蒙4.0核心技术-WebGL开发

场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。 接口说明 表1 WebGL主要接口列表 接口名描述canvas.getContext获取canvas对象上下文。webgl.createBuffer(): WebGLBuffernullwebgl.bindBuffer(target: GLenum, buffer: …

打开VScode时不打开上次使用的文件夹

是不是很烦VScode 打开新的文件夹&#xff0c;每次都打开上次使用过的文件夹&#xff0c;只需在设置里面改一个设置就可以避免了。 Ctrl &#xff0c;打开设置&#xff0c;搜索 window.restoreWindows 通过这种设置就可以让VScode 每次打开新的文件夹而不打开上次的文件夹。

Apache RocketMQ 5.0 腾讯云落地实践

Apache RocketMQ 发展历程回顾 RocketMQ 最早诞生于淘宝的在线电商交易场景&#xff0c;经过了历年双十一大促流量洪峰的打磨&#xff0c;2016年捐献给 Apache 社区&#xff0c;成为 Apache 社区的顶级项目&#xff0c;并在国内外电商&#xff0c;金融&#xff0c;互联网等各行…

ST股票预测模型(机器学习_人工智能)

知己知彼&#xff0c;百战不殆&#xff1b;不知彼而知己&#xff0c;一胜一负&#xff1b;不知彼&#xff0c;不知己&#xff0c;每战必贻。--《孙子兵法》谋攻篇 ST股票 ST股票是指因连续两年净利润为负而被暂停上市的股票&#xff0c;其风险较高&#xff0c;投资者需要谨慎…

OpenCV4工业缺陷检测的六种方法

【文末送书】今天推荐一本机器视觉领域优质书籍 机器视觉 机器视觉是使用各种工业相机&#xff0c;结合传感器跟电气信号实现替代传统人工&#xff0c;完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成&#xff0c;特别是…

微信Windows版-无效的WeChatWin.dll文件,错误码126

更新的微信Windows最新版本&#xff0c;突然有一天打开微信提示“无效的WeChatWin.dll文件 错误码 ErrorCode:126,点击“确定”下载最新版本”。 卸载重新安装跟到windows目录下替换WeChatWin.dll皆无效 该解决方案适用于Windows系统&#xff1a;Windows7、Windows10、Windows…

【HarmonyOS开发】ArkUI中的自定义弹窗

弹窗是一种模态窗口&#xff0c;通常用来展示用户当前需要的或用户必须关注的信息或操作。在弹出框消失之前&#xff0c;用户无法操作其他界面内容。ArkUI 为我们提供了丰富的弹窗功能&#xff0c;弹窗按照功能可以分为以下两类&#xff1a; 确认类&#xff1a;例如警告弹窗 Al…

t-SNE高维数据可视化实例

t-SNE&#xff1a;高维数据分布可视化 实例1&#xff1a;自动生成一个S形状的三维曲线 实例1结果&#xff1a; 实例1完整代码&#xff1a; import matplotlib.pyplot as plt from sklearn import manifold, datasets """对S型曲线数据的降维和可视化"&q…

proxysql读写分离组件部署

一、前言 在mysql一主两从架构的前提下&#xff0c;引入读写分离组件&#xff0c;可以极大的提高mysql性能&#xff0c;proxysql可以在高可用mysql架构发生主从故障时&#xff0c;进行自动的主从读写节点切换&#xff0c;即当mysql其他从节点当选新的主节点时&#xff0c;proxy…

状态管理@Prop

目录 1、父组件State到子组件Prop简单数据类型同步 2、父组件State数组项到子组件Prop简单数据类型同步 3、从父组件中的State类对象属性到Prop简单类型的同步 Prop主要用用于父组件到子组件的数据级联更新&#xff0c;父组件的数据变化会影响到子组件的数据变化&#xff0c…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

Lazada商品详情API在电商中的价值及实时数据获取实践

一、引言 在电商行业&#xff0c;数据是驱动业务增长的关键。Lazada作为东南亚地区知名的电商平台&#xff0c;其商品详情API对于电商行业具有深远的影响。本文将探讨Lazada商品详情API在电商行业中的重要性&#xff0c;并介绍如何实现实时数据获取。 二、Lazada商品详情API的…

秋招总结_就业

2020秋招总结 【前言】 以下内容是写给研二学弟学妹们的秋招总结&#xff0c;研一的师弟师妹们如有需要&#xff0c;也可看看。先说一下我为什么要写这个总结&#xff1a; 1、时代在变化&#xff0c;社会在发展&#xff0c;一届有必要给下一届讲一些经验。 2、我平时和你们…