1.管道技术-Windows
管道是一种简单的进程间通讯的技术。
管道就是一部份共享内存以便进程可以用来相互通信,创建了Pipe内核对象的进程就是一个Pipe Server, 当另一个进程与这个进程创建的Pipe Server连接时,就称为Pipe Client.当一个进程往Piple当中写入信息时,另一个进程便可以从这个Pipe读出这个信息。
管道可以分为命名管道和匿名管道。匿名管道比命名管道要简单很多,他是一个未命名的单向管道,常用来在一个父进程和一个子进程之间传递数据,匿名管道只能实现本地机器上两个进程的通信,不能实现跨网络的通信。
匿名管道由CreatePipe()函数创建,他的定义如下
BOOL CreatePipe(
PHANDLE hReadPipe, // 指向读句柄的指针(指向HANDLE类型的指针,返回管道的读句柄)
PHANDLE hWritePipe, // 指向写句柄的指针(指向HANDLE类型的指针,返回管道的写句柄)
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向SECURITY_ATTRIBUTES结构体的指针,检测返回的句柄是否能够被子进程继承。
DWORD nSize // 指定管道的缓冲区大小,这里赋值为0,使用系统默认大小的缓冲区
);
SECURITY_ATTRIBUTES结构体定义如下:
typedef struct _SECURITY_ATTRIBUTES
{
DWORD nLength;//结构体大小,可用sizeof取得
LPVOID lpSecurityDescriptor; //指向一个对象的安全描述符 该安全描述符控制对象的共享 如果为NULL 则该对象使用调用进程的默认安全描述符
BOOL bInheritHandle;//安全描述的对象能否被新创建的进程继承返回句柄 若为TRUE 则新进程继承该句柄
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
一个匿名管道有两头,他们分别是读句柄和写句柄。写句柄用来写入数据,读句柄用来读取数据。我们分别调用ReadFile()和WriteFile() 就可以了。
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DOWRD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped
);
在读取管道数据前,需要判断管道是够有数据存在。负责这个工作的函数是PeekNamedPipe(),其定义如下:
BOOL WINAPI PeekNamedPipe(
HANDLE hNamedPipe, //管道句柄
LPVOID lpBuffer, //读取输出缓冲区,可选,没有数据是null
DWORD nBufferSize, //缓冲区大小,如果上面那个是null,那就忽略这个
LPDWORD lpBytesRead, //接收从管道中读取数据的变量的指针,可选,此参数可以为NULL,如果没有数据要读取。
LPDWORD lpTotalBytesAvail, //接收从管道读取的字节总数,此参数可以为NULL,如果没有数据要读取。
LPDWORD lpBytesLeftThisMessage //返回该消息中剩余的字节数,对于匿名管道可以为0
);