匿名管道

时间:2010-08-19 13:07:20

标签: c++ windows pipe handles anonymous-pipes

我写了两个使用匿名管道进行通信的短程序。父进程通过为子进程设置标准IO句柄来共享管道句柄:

// -- Set STARTUPINFO for the spawned process -------------------------
ZeroMemory(&m_ChildSI, sizeof(STARTUPINFO));
GetStartupInfo(&m_ChildSI);

m_ChildSI.dwFlags       = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
m_ChildSI.wShowWindow   = SW_HIDE;
m_ChildSI.hStdError     = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdOutput    = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdInput     = m_pipeParent.ReadPipeHandle();

孩子通过调用GetStdHandle获取了一个读管道句柄:

hReadPipe = GetStdHandle(STD_INPUT_HANDLE)

我的问题是: 管道句柄由父进程创建,父进程在父进程和子进程完成通信后调用CloseHandle()。

孩子是否也必须调用CloseHandle()?我在想,因为这些是标准的IO句柄,当进程折叠时它们会被自动释放。

谢谢!

3 个答案:

答案 0 :(得分:3)

在Win32上,管道等内核对象是一个或多个用户模式句柄的引用。关闭所有句柄后,可以关闭基础对象。

每个进程中的句柄虽然可能具有相同的值,并且可能引用同一个对象,但它们是不同的句柄,应该单独关闭。

答案 1 :(得分:1)

我刚刚在MSDN上的文档Pipe Handle Inheritance中读到:

“当孩子完成管道时,它应该通过调用CloseHandle或终止来关闭管道句柄,这会自动关闭句柄。”

答案 2 :(得分:0)

当应用程序终止时,任何句柄都可以保持未关闭状态,Windows将自动释放资源。但是最好手动关闭它们,这样一切都是合乎逻辑和连贯的。当代码重用或现代化时,保持打开句柄可能会导致错误和泄漏。

相关问题