匿命管道只能使用于有父子关系的两个进程(至少目前为止还没听过使用于无关的两个进程)。
当初在学习进程间通讯的都是在Linux下学的,现在学习Win32的进程间通讯遇到一样概念的技术某种程度上的差异,搞得令人很头痛。
匿名管道的使用需要以下步骤(MDSN中有步骤一样的实例,只是这里将使用CreateProcess来创建子进程):
父进程中:
1.创建匿名管道:
BOOL CreatePipe(
PHANDLE hReadPipe,
PHANDLE hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD nSize
);
SECURITY_ATTRIBUTES 中的 bInheritHandle 必须为TRUE,才能使可共享的句柄在子进程中被共享。
2.创建子进程(关建步骤):
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
例:
STARTUPINFO sui={0};
PROCESS_INFORMATION pi = {0};
sui.cb = sizeof(STARTUPINFO);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdOutput = hRead;
sui.hStdInput = hWrite;
sui.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreateProcess(L"...",NULL,NULL,NULL,
TRUE,0,NULL,NULL,&sui,&pi); // 可以通过博客 Win32API 分类里的CreateProcess了解使用,也可以使用通过查看MSDN;
在这里将子进程的标准输入和标准输出替换成管道的读写句柄。
3、匿管道读写:
使用ReadFile操作创建管道时获得的读句柄,使用WriteFile操作创建管道时获得的写句柄。
子进程中:
1、得到管道的读写句柄:
HANDLE GetStdHandle(
DWORD nStdHandle
);
因为在父进程中创建子进程时,我们将子进程的标准输入输出句柄都替换成了管道的读写句柄。所以需要使用这一函数获得管道的读写句柄。
2、匿管道读写:
使用ReadFile操作创建管道时获得的读句柄,使用WriteFile操作创建管道时获得的写句柄。