计算机中管道pipe类似于现实世界中的水管道,在一端放入水流,另一端就会流出来。在计算机机中水流自然被数据流所代替了。计算机中管道分为匿名管道和命名管道,本篇将主要介绍用匿名管道来完成这一重定向输出任务
先来看看如何创建和使用匿名管道。
第一个 CreatePipe
函数功能:创建管道
函数原型:
BOOLWINAPICreatePipe(
PHANDLEhReadPipe,
PHANDLEhWritePipe,
LPSECURITY_ATTRIBUTESlpPipeAttributes,
DWORDnSize
);
函数说明:
第一个参数返回新创建的管道的读取端句柄。
第二个参数返回新创建的管道的写入端句柄。
注意不能在管道的读取端写入数据也不能在写入端读取数据。
第三个参数表示管道的安全属性,通常可以作如下设置:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
第四个参数表示管道的缓冲区容量,为0表示使用默认大小。
函数执行成功返回TRUE,否则返回FALSE。
第二个 ReadFile
函数功能:从管道中读取数据
函数原型:
BOOLReadFile(
HANDLEhFile,
LPVOIDlpBuffer,
DWORDnNumberOfBytesToRead,
LPDWORDlpNumberOfBytesRead,
LPOVERLAPPEDlpOverlapped
);
函数说明:
第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指向缓冲区的指针,函数将读取的数据写入该缓冲区。
第三个参数的表达非常好,光从名字上就可以知道这是用来指定读取的字节数。
第四个参数将返回实际读取到的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。
第三个 WriteFile
函数功能:向管道写入数据
函数原型:
BOOLWriteFile(
HANDLEhFile,
LPCVOIDlpBuffer,
DWORDnNumberOfBytesToWrite,
LPDWORDlpNumberOfBytesWritten,
LPOVERLAPPEDlpOverlapped
);
函数说明:
第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指针,该指针指向待写入管道的数据。
第三个参数表示要写入的字节数。
第四个参数将返回实际写入管道的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。
第四个CloseHandle
函数功能:关闭管道的一端
函数原型:BOOLCloseHandle(HANDLEhObject);
函数说明:当读取和写入端都关闭后,系统会关闭管道并回收资源。
从后面三个函数可以看出,向管道中读取和写入数据就和向文件中读取和写入数据是一样的(事实上管道也是一种特殊的文件——内存映射文件)。
使用管道要注意的一个地方是:读取和写入数据时,一定要注意顺序,MSDN上说,如果管道中没有数据,调用ReadFile()会造成阻塞,直到有其它线程将数据写入管道。同样,当有线程正在管道中读取数据时,其它试图将数据写入管道的的线程也会被阻塞。
计算机中管道pipe类似于现实世界中的水管道,在一端放入水流,另一端就会流出来。在计算机机中水流自然被数据流所代替了。计算机中管道分为匿名管道和命名管道,本篇将主要介绍用匿名管道来完成这一重定向输出任务,命名管道就留给下一篇来介绍了。
先来看看如何创建和使用匿名管道。
第一个 CreatePipe
函数功能:创建管道
函数原型:
BOOLWINAPICreatePipe(
PHANDLEhReadPipe,
PHANDLEhWritePipe,
LPSECURITY_ATTRIBUTESlpPipeAttributes,
DWORDnSize
);
函数说明:
第一个参数返回新创建的管道的读取端句柄。
第二个参数返回新创建的管道的写入端句柄。
注意不能在管道的读取端写入数据也不能在写入端读取数据。
第三个参数表示管道的安全属性,通常可以作如下设置:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
第四个参数表示管道的缓冲区容量,为0表示使用默认大小。
函数执行成功返回TRUE,否则返回FALSE。
第二个 ReadFile
函数功能:从管道中读取数据
函数原型:
BOOLReadFile(
HANDLEhFile,
LPVOIDlpBuffer,
DWORDnNumberOfBytesToRead,
LPDWORDlpNumberOfBytesRead,
LPOVERLAPPEDlpOverlapped
);
函数说明:
第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指向缓冲区的指针,函数将读取的数据写入该缓冲区。
第三个参数的表达非常好,光从名字上就可以知道这是用来指定读取的字节数。
第四个参数将返回实际读取到的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。
第三个 WriteFile
函数功能:向管道写入数据
函数原型:
BOOLWriteFile(
HANDLEhFile,
LPCVOIDlpBuffer,
DWORDnNumberOfBytesToWrite,
LPDWORDlpNumberOfBytesWritten,
LPOVERLAPPEDlpOverlapped
);
函数说明:
第一个参数为句柄,可以是创建文件函数CreateFile()的返回值也可以是管道。
第二个参数是一个指针,该指针指向待写入管道的数据。
第三个参数表示要写入的字节数。
第四个参数将返回实际写入管道的字节数。
第五个参数是用于异步操作方面,一般传入NULL即可。
第四个CloseHandle
函数功能:关闭管道的一端
函数原型:BOOLCloseHandle(HANDLEhObject);
函数说明:当读取和写入端都关闭后,系统会关闭管道并回收资源。
从后面三个函数可以看出,向管道中读取和写入数据就和向文件中读取和写入数据是一样的(事实上管道也是一种特殊的文件——内存映射文件)。
使用管道要注意的一个地方是:读取和写入数据时,一定要注意顺序,MSDN上说,如果管道中没有数据,调用ReadFile()会造成阻塞,直到有其它线程将数据写入管道。同样,当有线程正在管道中读取数据时,其它试图将数据写入管道的的线程也会被阻塞。