为了方便父进程读取子进程的stdout,一般会在父进程创建一个管道或者临时文件,并给这个管道或者临时文件设置 SECURITY_ATTRIBUTES bInheritHandle = TRUE。然后设置 STARTUPINFO,重置hStdOutput为上面创建的句柄,并在CreateProcess的时候把bInheritHandles设置为TRUE。
这种操作方法,在同时创建多个子进程的时候会带来深层的隐患。例如两个线程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