我写了两个使用匿名管道进行通信的短程序。父进程通过为子进程设置标准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句柄,当进程折叠时它们会被自动释放。
谢谢!
答案 0 :(得分:3)
在Win32上,管道等内核对象是一个或多个用户模式句柄的引用。关闭所有句柄后,可以关闭基础对象。
每个进程中的句柄虽然可能具有相同的值,并且可能引用同一个对象,但它们是不同的句柄,应该单独关闭。
答案 1 :(得分:1)
我刚刚在MSDN上的文档Pipe Handle Inheritance中读到:
“当孩子完成管道时,它应该通过调用CloseHandle或终止来关闭管道句柄,这会自动关闭句柄。”
答案 2 :(得分:0)
当应用程序终止时,任何句柄都可以保持未关闭状态,Windows将自动释放资源。但是最好手动关闭它们,这样一切都是合乎逻辑和连贯的。当代码重用或现代化时,保持打开句柄可能会导致错误和泄漏。