使用命名管道重定向子进程输入/输出

时间:2015-01-22 22:37:15

标签: c++ c winapi named-pipes

在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,它似乎无法在匿名管道中配置。

0 个答案:

没有答案