匿名管道

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句柄,所以它们会在进程关闭时自动释放。 谢谢!

1
我认为你总是需要关闭管道的两端,至少要清除文件描述符表中的条目... - James
我通常会使用应用程序验证器,在Visual Studio / 调试模式下检查泄漏的内存或句柄,但是因为子进程是由父进程创建的,所以子进程不会通过Visual Studio运行,所以我有点不确定。 我在MSDN上阅读了“管道句柄继承”文档,其中提到:“当子进程使用完管道后,应通过调用CloseHandle关闭管道句柄或终止来自动关闭句柄。”所以我想我们两个都是对的! - user206705
你可以随时将调试器附加到正在运行的进程上(菜单 调试->附加到进程 或类似选项)。 - adf88
3个回答

3

在Win32系统中,诸如管道等内核对象由一个或多个用户模式句柄引用。当所有句柄关闭时,底层对象可以关闭。

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


1
我刚在MSDN的管道句柄继承文档中读到:
“当子进程完成管道操作后,应该通过调用CloseHandle函数关闭管道句柄或者终止进程来自动关闭句柄。”

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接