团灭Windows进程通信(五)——经常听到匿名管道

本文介绍了Windows下的匿名管道,作为本地进程通信的手段之一,适合初学者理解。文章阐述了管道的基本概念,即允许两个进程通过管道进行单向数据传输,并提供了API函数CreateFile和ReadFile、WriteFile的使用示例。通过创建四个管道实现两个进程间的双向通信,并给出了进程重定向的简单说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章来源:http://download.youkuaiyun.com/detail/huanglong8/9720228

匿名管道,命名管道,文件映射,这是本地进程通信三大剑客啊,如果你是小白,你一定经常听别人说,也会遇到面试问,如果你是猴子,什么管道的已经烂熟于心,项目中和socket一样,烂到肌肉里,闭着眼睛,都能敲出个所以然来。但。这篇文章是讲个小白听的,并且,也不会讲过多的内存知识,一切以实践优先。

所谓管道,就是有两个进程,可以通过一种技术,相互传递数据的东西。可以理解为,从管道的一头灌入数据,就会从管道的另外一头流出数据。所以匿名管道是单向传输的,意思就是,如果两个程序都要有读写操作,则需要建立两个管道,就像水管和线管一样。

Windows直接提供API函数

WINBASEAPI
BOOL
WINAPI
CreatePipe(
    _Out_ PHANDLE hReadPipe,
    _Out_ PHANDLE hWritePipe,
    _In_opt_ LPSECURITY_ATTRIBUTES lpPipeAttributes,
    _In_ DWORD nSize
    );

第一个和第二个参数无需多做解释,意思就是某个管道的句柄,到时候直接取就行了。
第三个参数是安全描述符,干什么用的呢,就是父子进程权限不同时的一种安全通信策略,例如user权限进程调用子进程,子进程来源于token的某某system进程,那么两个权限不同的进程,也是属于父子进程的关系,那么,在进行父子匿名通信时,这个安全策略就起到至关重要的作用了。

system权限创建用户权限进程 — — 点此了解

第四个参数就是个大小,每种管道都有流量么对吧,那这个大小就是流量的限制了,0就是默认的设置,这个默认值从MSDN上来看,应该是根据机器的不同计算出来的,我也就没在细查。

还有两个API需要介绍,就是读写管道的API。

BOOL ReadFile(

  HANDLE hFile,

  LPVOID lpBuffer,

  DWORD nNumberOfBytesToRead,

  LPDWORD lpNumberOfBytesRead,

  LPOVERLAPPED lpOverlapped

);

第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指向缓冲区的指针,函数将读取的数据写入该缓冲区。
第三个参数的表达非常好,光从名字上就可以知道这是用来指定读取的字节数。
第四个参数将返回实际读取到的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。

BOOLWriteFile(

  HANDLEhFile,

  LPCVOIDlpBuffer,

  DWORDnNumberOfBytesToWrite,

  LPDWORDlpNumberOfBytesWritten,

  LPOVERLAPPEDlpOverlapped

);

第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指针,该指针指向待写入管道的数据。
第三个参数表示要写入的字节数。
第四个参数将返回实际写入管道的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。

了解了这三个API后,就可以着手实践,看看程序是怎么运行的了。
我们还是以两个进程通过控制台IO进行通信聊天作为示例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值