1

STARTUPINFO在调用CreateProcess. 流程结束后是否需要打电话CloseHandlehStdErrorhStdInput

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;
4

2 回答 2

3

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

请注意,hStdOutput应该是INVALID_HANDLE_VALUE而不是 NULL: 这是传递缺少句柄的约定STARTUPINFO

于 2013-02-06T13:21:02.527 回答
0

对于“你需要吗?”这个问题。- 简单回答是不”。当一个进程结束时,所有连接到它的句柄都会在 Windows 操作系统中被销毁。如果你在一个进程中创建一个进程(我什至不想在 C 中尝试,但在 C# 中很简单),那么它会更安全确保子进程在(或on-)终止之前自行清理。

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

于 2013-02-06T13:21:19.380 回答