1. 概述
匿名管道是在本地机器上使用,实现父进程和子进程之间的通信的进程通信机制。需要注意两点:
(1)就是在本地机器上,这是因为匿名管道不支持跨网络之间的两个进程之间的通信
(2)实现的是父进程和子进程之间的通信,而不是任意的两个进程,因为需要继承父进程的读写管道句柄
(1)就是在本地机器上,这是因为匿名管道不支持跨网络之间的两个进程之间的通信
(2)实现的是父进程和子进程之间的通信,而不是任意的两个进程,因为需要继承父进程的读写管道句柄
匿名管道的作用之一是输出重定向,也就是如下面的图中所示的功能
上面红色框框中文本是在DOS窗口下输出的,可以通过管道将DOS程序的输出在界面文本编辑框进行输出。
这里需要介绍CreatePipe()函数,它的原型为
BOOL WINAPI CreatePipe(
__out PHANDLE hReadPipe, //参数 hReadPipe 为输出参数,该句柄代表管道的读取句柄。
__out PHANDLE hWritePipe, //参数 hWritePipe 为输出参数,该句柄代表管道的写入句柄
__in LPSECURITY_ATTRIBUTES lpPipeAttributes, //参数 lpPipeAttributes 为一个输入参数,指向一个 SECURITY_ATTRIBUTES 的结构体指针
__in DWORD nSize //管道的缓存大小
);
这里由于是父子进程的关系,需要对SECURITY_ATTRIBUTES结构体进行设置,它的原型为
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; //结构体大小
LPVOID lpSecurityDescriptor; //
BOOL bInheritHandle; //由于是父子进程,一定要设置为True,允许继承
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
2. 父进程
父进程主要执行的操作是:
(1)使用CreatePipe()函数创建管道
(2)使用CreateProcess()函数创建子进程,在这个过程中指定好子进程的输入和输出句柄
(3)监听管道,读取数据