什么事IPC(Inter-Process Communication,进程间通信)

2023-10-29

进程间通信IPC,也就是Inter-Process Communication的缩写。

    首先我们明白一个进程其实就是一个狭义上的程序。

    一个服务器也就是一个进程。比如客户端和服务器的连接就是两个进程在通信,只是这两个进程并不在同一台计算机上,它们进程间的通信方式就是我们非常熟悉的sockt接口,更下层一些可能就是TCP/IP协议。

    那么进程间为什么要通信呢?简单说来,单进程的程序已经远远不能满足我们的需要了,进程与进程间通信就组成了更大的一个系统。比如P2P的软件就是两个不同计算机的程序进行数据交互,从而完成下载或通信的任务。

   进程由于是内核(OS kernel)的功能,因此进程的创建和通信其实和各种OS紧密相关的。当然现在OS在架构上有很多思想是想通的,所以进程间通信在各种操作系统上有不同也有相同的地方。

   另外,当前很多语言和框架(Framework)为了实现跨平台性,都封装了进程的操作,将线程的使用提高到了语言的层面。而不用developer再去进行系统调用(或系统API)来操作进程了。比如Java语言,进程和线程就是其语言提供的。再比如QT框架,也提供了进程线程的操作,弥补了C/C++语言上没有提供进程线程的遗憾。我们这里还是有必要了解下各个OS在系统调用层次的进程操作。

    一. 在Windows OS上,有几种常用的进程间通信方式:

        1 文件映射

        文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。

Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。

应用程序有三种方法来使多个进程共享一个文件映射对象。

(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。

(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。

(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。

文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。

 

        2 共享内存

        Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。

     

       3 匿名管道

       管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。

匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。

匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。

 

      4 命名管道

      命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。

    

     5 动态连接库

     Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。

虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。

 

     6 远程过程调用

     Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。

由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。

    

     7 Sockets

    Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。

现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。

 

    8 WM_COPYDATA消息

    WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。

WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

  

   二. linux下进程间通信的几种主要手段简介:

  1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
  2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
  3. 报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  4. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  5. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
  6. 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

 

    三. 在Symbian系统上,IPC的主要实现方式就是client-server框架。它可是symbian OS 上的元老之一。在Psion Series 5上就已经实现了,直到symbian OS v9.5都在不断的改进扩展新的功能。client-server在OS上随处可见,比如F32(文件服务)、ESOCK(socket服务)、大名鼎鼎的WSERV(window 服务)以及ETEL(电话服务)等等。从使用client-server的角度来看,developer只需要关注4个接口类:CServer2、CSession2、RSessionBase和RSubSessionBase,其中前两个类的实例运行于user端的server端,后两个类实际上是提供给client使用的接口,运行于user端的client端。由此可见client-server框架非常便利,它的工作过程可以大体描述为:

1.        client使用全局唯一的server名字与server建立起连接,创建一个session。

2.        如果server没有启动,就启动之。

3.        server一启动就是发出一个request检查kernel端消息队列是不是有待处理的消息。

4.        client发送消息给server。实际上将消息放入到kernel端的消息队列中。

5.        client等待消息的处理结果。

6.        一旦有消息,server就取出一个消息

7.        server处理消息

8.        server处理完消息后,通知client消息已经处理完。

注意,消息队列FIFO队列,并且server一次只能取出一个消息,不能并行处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么事IPC(Inter-Process Communication,进程间通信) 的相关文章

  • 接口测试之Fiddler弱网测试

    前言 目前市面上的APP功能越来越丰富 移动端测试也越显为重要 因为用户在网速慢的情况下 你的网站 软件 总能出现各种各样的问题 请不要忽略这一点 针对在不同的网络情况下 接下来 本篇要讲述的就是在通过fiddler对APP进行模拟弱网测试
  • 如何处理 C 和 Python 之间的 IPC?

    我有一个具有两个进程的应用程序 一个在 C 中 一个在 Python 中 C 进程是完成所有繁重工作的地方 而 Python 进程则处理用户界面 C 程序每秒向大型缓冲区写入 4 次 Python 进程读取该数据 至此与Python进程的通
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • 2种方法,教你使用Python实现接口自动化中的参数关联

    通常在接口自动化中 经常会参数关联的问题 那么什么是参数关联 参数关联就是上一个接口的返回值会被下一个接口当做参数运用 其中Python中可以实现参数关联的方法有很多种 今天小编给大家介绍下 如何通过Python来实现接口自动化中的参数关联
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 测试工程师能否作为一份「终身职业」?30岁+怎么办?

    讨论 测试工程师可否作为一份终生的职业 这是我在论坛看到的一个讨论 你的答案是什么呢 我希望大家能认真思考后给出一个属于自己的答案 无论你是新手入门 还是资深专家 回答这个问题请不要凭一腔热血 也不用过分消极 别总和钱挂钩 平心而论即可 就
  • 测试开发必知:有Tomcat,为什么还要Nginx?

    只用Tomcat 不用Nginx搭建Web服务 行不行 我曾经提出的愚蠢问题 今天详细给自己解释下 为什么必须用Nginx 不用Nginx 只用Tomcat的Http请求流程 浏览器处理一个Http请求时 会首先通过DNS服务器找到域名关联
  • 测试用例评审流程优化

    测试用例 评审是QA日常工作流程中的关键一环 是QA同学完善测试用例 交流测试经验的好机会 负责组内测试用例建设以来 作者对于评审流程做了一些优化工作 本文作者将整个优化过程中的心得体会做了一个总结 希望能给大家带来帮助 01 原始流程 1
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM
  • PHP - 访问用 C++ 创建的共享内存

    几天以来 我一直在努力让以下事情发挥作用 我有一个微型 C 程序 它从串行端口连续读取一些数据 该数据存储在共享内存中 如下所示 HANDLE hMapFile hMapFile CreateFileMapping INVALID HAND
  • C# 和 C++ 之间的进程间通信

    我正在为游戏编写一个机器人 它具有 C API 接口 即 当事件发生时 游戏会调用 Cpp dll 中的方法 该 dll 可以回调游戏中的方法来触发操作 我真的不想用 C 编写我的机器人 我是一个相当有经验的 C 程序员 但我根本没有 C
  • 将管道/连接作为上下文参数传递给多处理 Pool.apply_async()

    我想使用管道与池中的流程实例进行通信 但出现错误 让 p 成为 Pool 的一个实例 master pipe worker pipe Pipe self p apply async worker task handler info cont
  • 使用 Cromis IPC 进行双向通信

    我已经下载并玩了克罗米斯工控机 http www cromis net blog 2009 11 cromis ipc fast inter process communication named pipes 来自 Iztok Kacin
  • 有没有一种简单的方法可以清除C中的管道

    我有一个所有子进程都使用的管道 但在子进程使用该管道与父进程通信之前 我需要清除它 以便父进程正确读取它 C 中有一个简单的函数可以做到这一点吗 清除 管道的方法是从管道中读取数据 直到缓冲区为空 这对你没有帮助 我猜测您真正的问题是父级可
  • 将一个对象传递给默认 AppDomain,以从进程内创建的子 AppDomain 接收回调

    地点 我正在从我的进程创建一个子应用程序域来加载程序集 我能够调用此 AppDomain 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain 以接收从新 AppDomain 中加载的程序集到我的默认 A
  • Windows服务之间如何通信

    我有 2 个使用 C 创建的 Windows 服务 我希望其中一个服务调用第二个 Windows 服务中的函数 我该怎么做呢 EDIT 问题是我必须运行该应用程序 我不需要它们 相反服务进程也很好 但我need这2个应用程序进行通信 这2个
  • 在Python中与子进程多次通信

    这个问题不是重复的 与一个进程进行多次通信而不破坏管道 https stackoverflow com questions 3065060 communicate multiple times with a process without
  • 如何从单独的进程监控应用程序崩溃

    我有一个特定的 net 应用程序 偶尔会因以下 Windows 错误之一而崩溃 application name has encountered a problem and needs to close We are sorry for t
  • 远程过程调用认证

    我正在使用远程过程调用 RPC 在本地计算机上通信数据 我的要求是使用 RPC 在两个处理之间通信数据 但服务器应该通过某种方式对客户端进行身份验证 我遇到了 RpcBindingSetAuthInfo 它设置身份验证和授权信息 第四个参数
  • 在 C# 进程之间共享对象的推荐方式

    我已经阅读了许多关于 2 个 C 应用程序之间的 IPC 及其优缺点的不同内容 但我觉得我还没有为我的用例找到令人满意的答案 我有一个已经存在的对象 该对象会经常更改 我正在尝试将我的工具附加到游戏并使用它来调试使用该工具创建的元素 因此

随机推荐

  • ruoyi框架解决单个账户并发登录,限制多个浏览器或同一浏览器登录同个一账号

    ruoyi框架解决单个账户并发登录 限制多个浏览器或同一浏览器登录同个一账号 今天突然要解决限制一个账号多个浏览器登录问题 系统用的是若依框架 实现思路如下 application yml配置 这里在配置文件里面设置是否限制 如果以后不需要
  • 深入“自自顶向下,逐步求精”——面向过程程序设计方法

    文章转自 http blog csdn net sxhelijian article details 7303605 程序设计初学者常常受困于不会想问题 不知道让计算机解决这个问题该如何做 其实 程序员的一个基本功是 能够将复杂的问题分解开
  • 基于Vue实现一个有点意思的拼拼乐小游戏

    笔者去年曾写过一个类似的拼拼乐小游戏 技术栈采用自己的Xuery框架和原生javascript实现的 脚手架采用gulp来实现 为了满足对vue的需求 笔者再次使用vue生态将其重构 脚手架采用比较火的vue cli 前言 为了加深大家对v
  • 数据噪声以及去噪

    数据挖掘中的噪声简介 实际数据是数据挖掘算法的输入 它受多个组件的影响 其中 噪声的存在是关键因素 噪声是不可避免的问题 它会影响数据挖掘应用程序中经常发生错误的数据收集和数据准备过程 噪声有两个主要来源 隐式错误由测量工具引入 以及批处理
  • 【IEEE出版】工业自动化,机器人与控制工程国际会议(IARCE 2022)

    IARCE 工业自动化 机器人与控制工程国际会议 IARCE 2022 中国 成都 会议官方网站 www iarce org 会议邮箱 iarce hksra org 摘要时间 9月30日 全文截稿时间 10月7日 01 IARCE会议简介
  • 【Neo4j】第 6 章:节点重要性

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • mysql 多选数据类型_MySQL基础操作与数据类型

    目录 1 文件夹 库 增 改 查 删 2 文件 表 增 改 查 删 3 文件的一行内容增 改 查 删 4 创建表的完整语法 5 整型类型 6 补充sql mode 7 浮点型 8 字符类型 9 日期类型 10 枚举与集合类型 11 not
  • AIR103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方社区库接口GPIO库使用及示例进行复现及分析 了解该的基本原理及操作方法 软件及工具版本 LuatOS AIR103 b
  • 定时任务@Scheduled用法及其参数讲解

    1 基本用法 Scheduled 由Spring定义 用于将方法设置为调度任务 如 方法每隔十秒钟被执行 方法在固定时间点被执行等 Scheduled fixedDelay 1000 上一个任务结束到下一个任务开始的时间间隔为固定的1秒 任
  • android获取版本号报错,Android 7.1 Industry版本有概率启动报错(无法获取EGLConfig)...

    本帖最后由 prece 于 2020 7 22 11 48 编辑 在RK3399开发板 Station P1上 运行Android 7 1 Industry版本有概率启动报如下错误 07 22 11 36 31 746 595 595 F
  • [OpenAirInterface实战-8] :OAI编译遇到的问题与解决方法汇总

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 OpenAirInterface实战 8 OAI编译遇到的问题与解决方法汇总 文火冰糖 王文兵 的博客 CSDN博客 问题类型1 ASN 1
  • Sum It Up HDU - 1258【DFS】

    Given a specified total t and a list of n integers find all distinct sums using numbers from the list that add up to t F
  • 十年资深建模师教你如何用zbrush在圆柱或曲面上雕刻花纹

    在圆柱上面或者是曲面比较大的模型上面制作花纹 如果我们直接使用笔刷雕或是用alpha拉出来 可能效果不是很好 对于这种情况 我们需要结合UV制作这样的图案 如果想更多了解游戏建模可以加入我们的游戏建模交流团1046 777 540 只有数字
  • 六、深入理解JDK1.8中HashMap哈希冲突解决方案

    导读 前面文章一 深入理解 Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍 上两篇文章二 Jdk1 7和1 8中HashMap数据结构及源码分析 三 JDK1 7和1 8HashMap数据结构及源码分析 续 中我们分别对
  • Java基础之【使用迭代器删除List中的元素】

    直接看代码以及代码中注释 iterator的remove跟list的remove区别是 迭代器会在remove后进行expectedModCount modCount操作 这样就会避免 ConcurrentModificationExcep
  • python+selenium尝试处理滑块验证

    效果如图 处理思路 1 打开滑动验证页面 这个用selenium一步一步走过去 2 将滑动验证码的整个图片保存下来 3 对图片的像素点进行分析 发现拼图处像素特征如下 1 阴影起点处rgb的第一个值为0 2 阴影处的rgb三个值相加大部分小
  • 【机器学习基础 2】matplotlib库

    目录 一 什么是matplotlib库 二 基本用法 1 绘制简单的线图 plot 函数 2 绘制散点图 scatter 函数 3 绘制条形图 bar 函数 4 绘制饼图 pie 函数 三 重要用法 1 设置样式 2 添加标签 3 设置坐标
  • C++动态库使用

    个人博客地址 https cxx001 gitee io 前言 Windows与Linux下面的动态链接库区别 1 文件后缀不同 Linux动态库的后缀是 so 文件 而window则是 dll 文件 2 文件格式不同 a Linux下是E
  • GT911电容触摸屏使用

    注 转载于https blog csdn net qlexcel article details 99696108 一 介绍与硬件连接 GT911 GT928 GT9147都属于GT9系列非单层多点触控芯片 他们支持的触控点数不同 GT92
  • 什么事IPC(Inter-Process Communication,进程间通信)

    进程间通信IPC 也就是Inter Process Communication的缩写 首先我们明白一个进程其实就是一个狭义上的程序 一个服务器也就是一个进程 比如客户端和服务器的连接就是两个进程在通信 只是这两个进程并不在同一台计算机上 它