繁体   English   中英

如何在 Windows 上的 CreateProcess() 中不继承标准输入、标准输出和标准错误

[英]How to NOT inherit stdin, stdout and stderr in CreateProcess() on Windows

CreateProcessW() ,接受标志bInheritHandles 如果设置为FALSE ,则仅继承stdinstdoutstderr ,其他不继承。

继承所有内容有时很烦人,因此可以使用 扩展启动信息显式配置句柄以继承。 在这种情况下,默认情况下不会继承stdinstdoutstderr ,但可以通过将它们包含在UpdateProcThreadAttribute()的继承句柄中来继承它们。

这样,例如可以仅继承stderr

但作为一个具体案例,如何禁用它们(包括stdinstdoutstderr )? 如果我们为属性PROC_THREAD_ATTRIBUTE_HANDLE_LIST传递NULL /empty 列表,则UpdateProcThreadAttribute()失败。

请注意,在这种情况下,我不想重定向stdinstdoutstderr (我不想写入/读取它们),我只想禁用它们。

作为一种解决方法,可以创建一个虚拟HANDLE并继承它,以便可以禁用stdinstdoutstderr ,但这有点笨拙。 bInheritHandles设置为FALSE不起作用,因为它启用了stdinstdoutstderr 传递DETACHED_PROCESS可能会产生其他副作用(?)。

实现这一目标的正确方法是什么?

哦,如果设置了STARTF_USESTDHANDLES ,并且如果bInheritHandles设置为FALSE ,那么根本不会继承任何句柄,这正是我想要的:

STARTUPINFOW si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);

// This is important to disable stdin, stdout and stderr
si.StartupInfo.dwFlags = STARTF_USESTDHANDLES;

// si.hStdInput, si.hStdOutput and si.hStdError must not be set

编辑:或者,如此处所述,在dwCreationFlags dwCreationFlags传递DETACHED_PROCESSCreateProcess()的参数)也可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM