Winapi CreateProcess之后是否需要关闭标准I/O的句柄?

Winapi CreateProcess之后是否需要关闭标准I/O的句柄?,winapi,createprocess,Winapi,Createprocess,我在调用CreateProcess时使用了以下STARTUPINFO结构。进程结束后,是否需要在hStdError和hStdInput上调用CloseHandle startupInfo.cb = sizeof(startupInfo); startupInfo.cb = sizeof(si); startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; startupInfo.hStdInput = GetStdHand

我在调用
CreateProcess
时使用了以下
STARTUPINFO
结构。进程结束后,是否需要在
hStdError
hStdInput
上调用
CloseHandle

startupInfo.cb = sizeof(startupInfo);
startupInfo.cb = sizeof(si);
startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startupInfo.hStdOutput =  NULL;
startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
startupInfo.wShowWindow = SW_HIDE;

因为您没有打开这些句柄(这不是
GetStdHandle
是的),您不需要关闭它们(也许您想关闭它们) 出于其他原因,但不太可能)。(注意:即使你这样做了 打开句柄,您不必等待进程退出 关闭前:继承后,在父级中关闭它们 进程对子进程没有影响)

请注意,
hst输出
应该是
无效的\u句柄\u值
而不是
NULL
:这是将
STARTUPINFO

中缺少句柄的情况传递给问题“是否需要?”——简单的答案是“否”。 当进程结束时,所有连接到它的句柄都将在Windows OSs中销毁。。如果您在进程中创建一个进程(我甚至不想在C中尝试,但在C#中非常简单),那么在终止之前(或终止时)确保子进程在其自身之后进行清理会更安全


测试这一点的一种方法是,在父进程中终止子进程后尝试访问句柄。

我要澄清的是,对于缺少句柄的情况,使用
无效句柄值
STARTUPINFO
的惯例。一般来说,这不一定是正确的。但是说std句柄是从hStd句柄复制的,当不应该有句柄时,就设置为null。它甚至说无效的\u句柄\u值std句柄可能会导致WindowsXP–8出现错误@jamesdlin@lcosie我的评论是关于澄清这个答案的早期版本中的一个声明。无论如何,指定
无效的\u句柄\u值
。这是预期的行为,也是应用程序应该遵循的。Windows的某些版本是否有错误的实现是另一回事。