【发布时间】:2015-09-17 23:15:44
【问题描述】:
我正在尝试通过 Windows 中的匿名管道从子进程接收数据。我知道如何使用标准 I/O 流来做到这一点,但这些正在用于其他目的。我也知道如何在 Linux 或 OSX 中使用 fork()、pipe() 和 execv() 来做到这一点。
在 Windows 中,您可以使用CreatePipe() 创建一个管道,并使用SetHandleInformation() 使一端不可继承。然后对于标准输出和标准错误,您可以将STARTUPINFO(设置了hStdOutput 或hStdError)传递给CreateProcess(),以将另一端传递给孩子。在调用CreateProcess() 之后,父级最接近它的句柄到管道的子端。这在 MSDN 上的Creating a Child Process with Redirected Input and Output 中有详细解释。但是,除了通过 stderr、stdout 或 stdin 之外,我还没有找到将HANDLE 传递给孩子的方法。
我尝试将HANDLE 转换为类似这样的字符串:
std::ostringstream str;
str << hex << "0x" << handle;
std::string handleArg = str.str();
然后将其作为命令行参数传递,并将其转换回HANDLE,这只是子进程中的void *。虽然子进程显然继承了管道 HANDLE,但 HANDLE 的实际值必须与父进程中的不同,因为以这种方式传递它不起作用。
我知道我可以使用命名管道来执行此操作,但似乎应该可以使用匿名管道来执行此操作。
那么如何将管道 HANDLE 传递给 Windows 中的子进程?
更新 1:this MSDN article 中的示例代码似乎表明,至少对于套接字句柄,您可以将它们作为字符串传递给孩子。
Update2:原来我犯了一个错误。请参阅下面的答案。
【问题讨论】:
标签: c++ windows pipe ipc child-process