【发布时间】:2018-11-26 09:13:50
【问题描述】:
从一个用 rust 编写的程序 A,我想启动一个程序 B,让 A 结束,让 B 正常运行,就像它在 A 终止后从同一个 shell 手动启动一样。
我目前的计划:
use std::process::Command;
pub fn execute(exe: &str, args: &[&str]) {
Command::new(exe)
.args(args)
.spawn()
.expect("failed to start external executable");
}
fn main() {
execute("/usr/bin/nvim", &["/home/dys/todo.txt"]);
}
这失败了。 nvim 是作为子程序启动的,一旦调用程序停止,它就无法工作。
如何编写execute 以便调用程序立即停止并让nvim(或其他程序)正常运行(即使没有任何窗口系统)?
【问题讨论】:
-
父进程死后Windows真的会杀死所有子进程吗?自从我在 Windows 上进行软件开发以来已经过去了 20 年,但我不记得这种行为了。
-
@SvenMarnach 我不知道 Windows,因为我现在没有任何可用的盒子。我的要求是让它在 windows、linux 和 macos 上运行。我将删除操作系统标签(可能有一段时间)以明确这不是 Windows 特定的问题。
-
我错过了还有一个 Linux 标签。当父进程退出时,Linux 和 Windows 都不会杀死子进程。
-
@SvenMarnach 因为
process::spawn()正在父子之间设置一些管道。有一个while true; echo foo; sleep 1; done作为孩子,你应该看到失败。 -
这解释了为什么
os.setsid()在开始时该过程有效,以及为什么它不能用strace重现(stdin 不是 pty)