热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Windows下进程之间的通信(IPC)管道

Windows下进程之间的通信—管道进程间的通信(IPC、InterProcessCommunication)是指在不同的进程直接传播或这交换信息。IPC常用的通信方式有:管道(包
Windows下进程之间的通信—管道

进程间的通信(IPC、InterProcess Communication)是指在不同的进程直接传播或这交换信息。

IPC常用的通信方式有:

  1. 管道(包括匿名管道命名管道) :匿名管道只能在本机上的父子进程之间通信,而命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信 。
  2. 消息队列
  3. 信号量
  4. 共享存储
  5. Socket
  6. Streams等

其中 Socket和Streams支持不同主机上的两个进程IPC

管道介绍

管道的实现本质也是一种共享内存的方式实现多进程之间的通信,只是Windows为此设计了一宗数据流I/O的方式来访问这块共享内存。一个进程读、另一个进程写,这样类似于一个管道。

匿名管道:父子进程之间的通信,只能一端写,另一端读 一种单工的通信方式。、

命名管道:任何进程之间,同一时间在一个端口只能进行一种操作,因此是一种半双工的通信方式。

由于最近使用命名管道的方式实现客户端框架的集成,因此主要研究了一下NamePipe。

命名管道创建步骤

命名管道有点类似于我们常说的服务端和客户端。

服务器端命名管道实现的步骤:
1、创建命名管道CreateNamedPipe
2、等待客户端连接ConnectNamedPipe
3、接收客户端发送数据ReadFile & 向客户端发送数据WriteFile
4、关闭管道CloseHandle
客户端命名管道实现的步骤:
1、判断是否有可以用的命名管道WaitNamedPipe
2、打开管道CreateFile
3、接收客户端发送数据ReadFile & 向客户端发送数据WriteFile
4、关闭管道CloseHandle

1、命名管道服务端

管道名遵循的格式

\\.\pipe\pipename。最多可达256个字符的长度,而且不区分大小写
例如:"\\\\.\\pipe\\Name_pipe_test"

CreateNamedPipe

HANDLE WINAPI CreateNamedPipe(
LPCTSTRlpName,//管道名
DWORD dwOpenMode,//管道打开方式
//PIPE_ACCESS_DUPLEX 该管道是双向的,服务器和客户端进程都可以从管道读取或者向管道写入数据。
//PIPE_ACCESS_INBOUND 该管道中数据是从客户端流向服务端,即客户端只能写,服务端只能读。
//PIPE_ACCESS_OUTBOUND 该管道中数据是从服务端流向客户端,即客户端只能读,服务端只能写。
DWORD dwPipeMode,//管道的模式
//PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道。
//PIPE_TYPE_MESSAGE 数据用数据块(名为“消息”或“报文”)的形式写入管道。
//PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出。
//PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)。
//PIPE_WAIT 同步操作在等待的时候挂起线程。
//PIPE_NOWAIT 同步操作立即返回。
DWORD nMaxInstances,//表示该管道所能够创建的最大实例数量。必须是1到常数PIPE_UNLIMITED_INSTANCES(255)间的一个值。
DWORD nOutBufferSize,//表示管道的输出缓冲区容量,为0表示使用默认大小。
DWORD nInBufferSize,//表示管道的输入缓冲区容量,为0表示使用默认大小。
DWORD nDefaultTimeOut,//表示管道的默认等待超时。
LPSECURITY_ATTRIBUTES lpSecurityAttributes//表示管道的安全属性。
);

ConnectNamedPipe

BOOL WINAPI ConnectNamedPipe(
HANDLE hNamedPipe,//命名管道句柄指向一个命名管道实例的服务器的句柄,该句柄由CreateNamedPipe函数返回
LPOVERLAPPED lpOverlapped//一般为NULL指向OVERLAPPED结构体的指针,默认为NULL,表明使用默认的同步IO方式
);

接收客户端发送数据ReadFile & 向客户端发送数据WriteFile:

//文件的写入
WriteFile(hPipe, strMessage, sizeof(strMessage), &wLen, 0)
1、指定要写入数据的文件的句柄
2、指向包含将要将要写入文件的数据的缓冲区的指针
3、指明要向文件中写入的字节数
4、用来接收实际写入到文件中的字节数
5、指向OVERLAPPED结构体的指针,默认为NULL,表明使用默认的同步IO方式
//文件的读取
ReadFile(hPipe, buf, 256, &rLen, NULL)
1、指定要读取数据的文件的句柄
2、指向包含将要将要接收的文件中读取数据的缓冲区的指针
3、指明要向文件中读取的字节数
4、用来接收实际读取到的字节数
5、指向OVERLAPPED结构体的指针,默认为NULL,表明使用默认的同步IO方式

CloseHandle:

CloseHandle(hPipe); //关闭管道句柄

2、命名管道客户端

WaitNamedPipe

WaitNamedPipe(TEXT("\\\\.\\Pipe\\pipeTest"), NMPWAIT_WAIT_FOREVER)
1、指定命名管道的名称
2、指定超时间隔,NMPWAIT_WAIT_FOREVER表示一直等待,直到出现了一个可用的命名管道的实例

CreateFile

CreateFile("\\\\.\\Pipe\\Test",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
1、指定用于创建或打开的对象的名称
2、指定对象的访问方式,GENERIC_WRITE表示指定对象具有写访问
3、指定共享方式,如果此参数为0,表示对象不能被共享
4、指向SECURITY_ATTRIBUTES结构的指针,该结构指定了命名管道的安全描述符,如果没有特殊的需求,默认值为NULL
5、指定如何创建文件(OPEN_EXISTING表示打开文件,如果文件不存在,则函数调用失败)
6、设置文件属性和标志(FILE_ATTRIBUTE_NORMAL表示该文件没有其他属性设置)
7、指定具有GENERIC_READ访问方式的模板文件的句柄

###接收服务端发送数据ReadFile & 向服务端发送数据WriteFile:

//文件的写入
WriteFile(hPipe, strMessage, sizeof(strMessage), &wLen, 0)
1、指定要写入数据的文件的句柄
2、指向包含将要将要写入文件的数据的缓冲区的指针
3、指明要向文件中写入的字节数
4、用来接收实际写入到文件中的字节数
5、指向OVERLAPPED结构体的指针,默认为NULL,表明使用默认的同步IO方式
//文件的读取
ReadFile(hPipe, buf, 256, &rLen, NULL)
1、指定要读取数据的文件的句柄
2、指向包含将要将要接收的文件中读取数据的缓冲区的指针
3、指明要向文件中读取的字节数
4、用来接收实际读取到的字节数
5、指向OVERLAPPED结构体的指针,默认为NULL,表明使用默认的同步IO方式

推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 使用虚拟机配置服务器
    本文详细介绍了如何使用虚拟机配置服务器,包括购买云服务器的操作步骤、系统默认配置以及相关注意事项。通过这些步骤,您可以高效地配置和管理您的服务器。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
author-avatar
佩君晓萍4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有