Windows下调用CreateProcess()如何禁止继承stdin、stdout、stderr
正确实现方案
完全禁用所有句柄继承(包含stdin、stdout、stderr三个标准流)的规范做法如下:
- 初始化
STARTUPINFO(或STARTUPINFOEX)结构,设置dwFlags字段包含STARTF_USESTDHANDLES标志 - 将
STARTUPINFO结构下的hStdInput、hStdOutput、hStdError三个字段全部赋值为INVALID_HANDLE_VALUE - 调用
CreateProcessW()时将bInheritHandles参数设为FALSE即可
方案原理
STARTF_USESTDHANDLES标志的优先级高于系统默认的标准流继承逻辑:只要设置了该标志,CreateProcessW()会直接使用你显式传入的三个标准流句柄值,不会继承父进程的对应句柄bInheritHandles=FALSE保证了除标准流之外的所有句柄都不会被子进程继承,二者配合即可实现完全禁用所有句柄继承的需求- 该方案无需创建虚拟句柄,也不需要传入
DETACHED_PROCESS参数,不会引入额外副作用,兼容所有支持CreateProcessW()的Windows版本
如果你已经在使用扩展启动信息(STARTUPINFOEX)配置其他线程属性,且最低兼容Windows 10 1607(Build 14393)及以上系统,也可以直接给PROC_THREAD_ATTRIBUTE_HANDLE_LIST传入长度为0的空句柄列表,该场景下UpdateProcThreadAttribute()不会返回错误,也能实现完全禁用继承的效果。
内容的提问来源于stack exchange,提问作者rom1v
相关产品推荐
相关产品推荐

