这个问题至少有三个部分,所以请耐心等待:
1)CreateProcess有一个参数bInheritHandles,它使子进程继承父进程中所有可继承的句柄。此选项必须设置为 TRUE 以允许父级在 STARTUPINFO 参数中为子级指定 stdin、stdout 和 stderr 句柄。
2) 在 Win32 中,当有多个句柄打开同一个文件时,删除和重命名文件可能会失败。
3) Microsoft CRT 的 open() 函数默认会创建可继承的句柄。此外,默认情况下创建的文件句柄会遇到上述问题 2。
这种神奇的组合产生了以下操作问题:库 A 调用 open() 并且不希望后续的重命名和删除失败。在该过程的其他地方,另一个库 B 正在调用 CreateProcess,并将 bInheritHandles 设置为 TRUE(以捕获 stdin/out/err)临时创建重复句柄。现在偶尔库 A 的文件操作会失败。自然地,库 A 和 B 由不同的人维护。我还知道另一个库 A' 使用 open() 并遇到类似问题。
这篇知识库文章讨论了一个相关的问题和解决方案。但是它仍然依赖于在父进程中调用 CreateProcess 并将 bInheritHandles 设置为 TRUE,所以它不能解决这个问题。
我想知道其他人是否遇到过这个问题,是否没有众所周知的解决方案?
上面的 kb 文章基本上暗示在将 bInheritHandles 设置为 TRUE 的情况下调用 CreateProcess 是不明智的,所以我倾向于修复库 B,使其永远不会这样做。我会这样做: