You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下调用CreateProcess()如何禁止继承stdin、stdout、stderr

正确实现方案

完全禁用所有句柄继承(包含stdin、stdout、stderr三个标准流)的规范做法如下:

  1. 初始化STARTUPINFO(或STARTUPINFOEX)结构,设置dwFlags字段包含STARTF_USESTDHANDLES标志
  2. 将STARTUPINFO结构下的hStdInput、hStdOutput、hStdError三个字段全部赋值为INVALID_HANDLE_VALUE
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:54:02