Rust 的 std::process::Command 在 Windows 上是个糟糕的公民
假设你正在为 Rust 编写一个 Windows IPC 库,并希望将句柄传递给子进程。也许是一个管道,也许是一个文件,也许是一个代理进程句柄。
然而,由于 Rust 的一些特殊性,其实并没有一种绝对正确的做法来实现这一点。
来点 WinAPI 小知识!用于启动新进程的 CreateProcess 函数有两个参数,它们决定了子进程会继承哪些句柄。可能的组合有:
bInheritHandles = FALSE:不继承任何句柄,仅保留标准输入/输出句柄。bInheritHandles = TRUE且PROC_THREAD_ATTRIBUTE_HANDLE_LIST不存在:所有已设置“可继承”标志的句柄都会被继承。bInheritHandles = TRUE且PROC_THREAD_ATTRIBUTE_HANDLE_LIST存在:所有已在句柄列表属性中列出、且已设置“可继承”标志的句柄都会被继承。
只要程序中每次调用 CreateProcess 时都遵循 (1) 或 (3) 中的规则,一切就都很好:句柄会被允许列表化,而且不会发生意外地继承句柄的情况。
评论
?
参与讨论