博客
关于我
Windows下进程间通信的方法
阅读量:640 次
发布时间:2019-03-14

本文共 1966 字,大约阅读时间需要 6 分钟。

进程间通信(Interprocess Communication, IPC)是操作系统中的一个重要概念,主要用于不同进程之间传播或交换信息。 unlike进程的user space(用户空间),进程间的通信需要一个共同的介质,而系统空间则提供了这样的条件之一 - 共享内存区。从这个角度看,进程间可以通过磁盘上的普通文件或注册表中的一些表项和记录进行信息交换,这些手段虽然广泛使用,但通常不被视为典型的进程间通信方法。

进程间通信实际上是一组编程接口,用于让程序员协调不同进程的运行。这种机制使得一个程序能够在同一时间处理多个用户的请求。在现代操作系统中,进程间的通信是必然的,因为即使一个简单的用户请求也会导致多个进程的创建和执行。因此,IPC接口提供了必要的可能性,让这些进程能够互相通信和协作。

常见的进程间通信方法包括管道(PIPE)、消息队列、信号、共享内存以及套接字(Socket),此外还有一些广义上可以归类为进程间通信的方法,如文件映射和剪切板等。每一种方法都有其独特的优缺点,因此在实际开发中,通常不会使用所有的方法。

通信目的

进程间通信主要有以下几个关键目的:

  • 数据传输:将一个进程的数据发送给另一个进程,数据量通常在1字节到几兆字节之间。

  • 共享数据:多个进程能够同时操作一段共享数据,不同进程对共享数据的修改必须能立即被其他进程察觉。

  • 通知事件:一个进程需要告知另一个或多个进程某种事件发生,例如进程终止时需要通知父进程。

  • 资源共享:多个进程之间共享同样的资源,这种资源通常需要通过锁和同步机制来保护。

  • 进程控制:某些进程希望完全控制另一个进程的执行,例如调试进程。这类进程需要能够拦截目标进程的所有异常并及时了解其状态变化。

  • 通信方式

    进程间通信可以采用多种方式,以下是一些常见的实现方式:

  • 剪切板(Clipped Board):剪切板实际上是我们日常使用的剪切功能。当一个应用程序将数据复制到剪切板时,另一个应用程序可以从剪切板中获取数据。需要注意的是,剪切板只能在Windows环境下使用,且只能用于本地机器上的进程间通信。

  • 文件映射(Memory-Mapped Files):文件映射类似于在硬盘上创建一个文件,允许不同的进程向文件中写入和读取数据。与普通文件操作不同,文件映射通过内核虚拟出来的内存地址直接访问文件内容,这种方式具有较好的安全性和性能。文件映射是一种有效的共享数据方法,但只能在本地计算机上使用,且需要开发者控制进程间的同步。

  • 共享内存(Shared Memory):共享内存是文件映射的一种特殊实现方式,它映射了一段能被其他进程访问的内存区域。共享内存的优点是速度快,通常与其他同步机制结合使用,以实现进程间的高效通信。其缺点是安全性较高且只能在本地计算机上使用。

  • 套接字(Socket):套接字是基于TCP/IP协议实现的通信接口,广泛应用于网络通信中。其优势在于跨平台性强,可用于不同计算机之间的进程通信。然而,套接字主要用于网络通信,本地单机进程间的简单数据传输通常不建议使用套接字,而是建议使用WM_COPYDATA消息。

  • WM_COPYDATA消息:WM_COPYDATA消息是一种强大但不为人所知的消息。当一个进程需要向另一个进程传输数据时,可以使用SendMessage函数发送WM_COPYDATA消息。接收方只需按照普通消息处理方式处理该消息即可完成数据共享。这种方法在底层实际上是通过文件映射实现的,适用于本地计算机的单机环境。

  • 匿名管道(Anonymous Pipe):匿名管道是一种具有两个端点的通信通道,通常用于父进程与子进程之间的通信。匿名管道可以是单向或双向的,读写操作可以使用普通read、write等函数完成。匿名管道适合父进程创建后继承到子进程之间的通信,但不能用于多个相关进程之间的通信,也不能跨网络使用。

  • 有名管道(Named Pipe):有名管道是一种可以跨越多个进程和计算机的单向或双向通信通道。与匿名管道不同,有名管道可以在不相关进程之间使用,通过名字指定进程间通信。这种通信方式的编程接口简单,但在同时与多个进程通信时存在局限性。

  • 邮件槽(Mailslots):邮件槽提供单向通信能力,允许多个进程充当服务器进程和客户进程。邮件槽的消息传输使用了不可靠的UDP协议,因此在网络环境中的可靠性较低。但其简化的编程接口和广播通信能力使其成为一种灵活的通信选择。

  • 在实际应用中,开发者通常会根据具体需求选择合适的进程间通信方式,同时结合性能、安全性和可靠性进行权衡。例如,在需要跨机器通信且要求高可靠性的场景中,套接字或邮件槽是更好的选择;而在本地机器上需要快速、高效的进程间数据共享时,共享内存或WM_COPYDATA消息可能更为合适。

    转载地址:http://oeulz.baihongyu.com/

    你可能感兴趣的文章
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>