在MSDN文档中,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx使用匿名管道显示示例。 在描述中可以阅读:
"...Note that named pipes can also be used to redirect process I/O."
现在,我正在努力实现这一目标
对于stdin,我会做类似
的事情serverPipe = CreateNamedPipe(
szPipeName,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
1,
sizeof(TCHAR) * BUFSIZE,
sizeof(TCHAR) * BUFSIZE,
PIPE_TIMEOUT,
lpSa ); //lpSa has its inherited attribute set, just like in the msdn sample.
clientPipe = CreateFile(szPipeName, GENERIC_READ | GENERIC_WRITE, 0, lpSa, OPEN_EXISTING, 0, NULL);
两个管道都创建正常,稍后我关闭服务器(父进程)管道
CloseHandle(serverPipe);
因此,对ConnectNamedPipe的调用不会返回错误"管道的另一端已经有一个进程"。
以下是ConnectNamedPipe的代码
do
{
bSuccess = ConnectNamedPipe(serverPipe, &ol);
if (!bSuccess)
{
DWORD dwCode = GetLastError();
if (dwCode == ERROR_NO_DATA) continue;
if (dwCode == ERROR_PIPE_CONNECTED) break;
report_error(NULL);
}
} while (!bSuccess);
问题是它总是返回错误ERROR_NO_DATA(管道正在关闭)。所以从来没有完成循环。
注意:我需要继承子进程已经打开的管道的句柄,因为我没有子进程的源,因此无法更改它。
那么,有人能指出正确的方法吗?或者使用命名管道为使用Win32 API的子进程进行IO重定向的完整工作示例?
PS。我需要命名管道的原因是因为我想使用Overlapped IO,它似乎无法在匿名管道中配置。