文章来源: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进程,那么两个权限不同的进程,也是属于父子进程的关系,那么,在进行父子匿名通信时,这个安全策略就起到至关重要的作用了。
第四个参数就是个大小,每种管道都有流量么对吧,那这个大小就是流量的限制了,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进行通信聊天作为示例。