3

我编写了两个使用匿名管道进行通信的简短程序。父进程通过为子进程设置标准 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 句柄,所以当进程折叠时它们会被自动释放。

谢谢!

4

3 回答 3

3

在 Win32 上,诸如管道之类的内核对象是一个或多个用户模式句柄的引用。当所有句柄都关闭时,可以关闭底层对象。

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

于 2010-08-19T14:30:02.323 回答
1

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

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

于 2010-08-19T13:24:42.187 回答
0

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

于 2010-08-19T14:18:56.423 回答