管道分命名和匿名管道之分,利用命名管道可进行进程之间的通信。进程之间只有知道管道名称才能将共享内存的数据取走,并且根据服务进程创建管道的具体参数可具体指定客户进程对管道的访问权限。
首先要用到的是CreateNamedPipe函数:
HANDLE CreateNamedPipe( LPCTSTR lpName, // pipe name DWORD dwOpenMode, // pipe open mode DWORD dwPipeMode, // pipe-specific modes DWORD nMaxInstances, // maximum number of instances DWORD nOutBufferSize, // output buffer size DWORD nInBufferSize, // input buffer size DWORD nDefaultTimeOut, // time-out interval LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD );
管道名字、打开方式、管道模式、最大实例数、输出缓存大小、输入缓存大小、超时、安全信息结构。要尤其注意管道的命名方式,及打开模式对后续操作的限制。
此函数将返回管首的句柄,WaitNamedPipe函数用于客户端请求,ConnectNamedPipe函数等待客户进程的连接。客户端请求成功,即可使用命名管道,CreateFile第一个参数为管道名称返回一个句柄,而后就以此句柄进行通信,如:ReadFile,WriteFile。