使用重定向输入输出创建子进程的深层问题

为了方便父进程读取子进程的stdout,一般会在父进程创建一个管道或者临时文件,并给这个管道或者临时文件设置 SECURITY_ATTRIBUTES bInheritHandle = TRUE。然后设置 STARTUPINFO,重置hStdOutput为上面创建的句柄,并在CreateProcess的时候把bInheritHandles设置为TRUE。

https://docs.microsoft.com/zh-cn/windows/win32/procthread/creating-a-child-process-with-redirected-input-and-output?redirectedfrom=MSDN

这种操作方法,在同时创建多个子进程的时候会带来深层的隐患。例如两个线程A、B,都在同时创建文件映射,并同时创建子进程

A B
CreateFileMapping(inheritable=TRUE) CreateFileMapping(inheritable=TRUE)
returns handle H1 returns handle H2
CreateProcess(“A”, bInheritHandles=TRUE) CreateProcess(“B”, bInheritHandles=TRUE)
CloseHandle(H1) CloseHandle(H2)

这样子进程A、B都会同时拥有H1、H2的句柄。如果子进程B不结束,子进程A也无法彻底关闭H1。在Vista之后,windows对CreateProcess进行了扩展,增加了STARTUPINFOEX,可以明确的指定哪些句柄可以被继承
https://devblogs.microsoft.com/oldnewthing/20111216-00/?p=8873

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容