为什么Command :: output会比其产生的子进程停留更长的时间?

时间:2019-11-20 17:17:26

标签: rust multiprocessing rust-cargo

我有一个程序A,它使用Command::spawn生成了一个长时间运行的进程并返回:

fn main() {
    std::process::Command::new("sleep").arg("8").spawn().unwrap();
}

同时,程序B调用程序A并等待输出:

fn main() {
    std::process::Command::new("target/debug/programA").output().unwrap();
}

预期行为

在程序B的目录中运行cargo run会在几微秒内返回,几乎与单独运行程序A所需的时间相同。

观察到的行为

程序A自行花费大约200微秒,而程序B阻塞8秒钟。

该怎么办?

我创建了a small project来显示此行为。我也曾尝试在异步环境中使用其他包装箱,例如subprocesstokio::net::process,但它们的行为相同。这是我第一次遇到此行为,但找不到任何文档来解决此问题。

1 个答案:

答案 0 :(得分:0)

因此,考虑到@Stargateur的评论,我做了一个小的更改,并使它生效。所有命令通过管道传递或设置为空。Stdout,Stdin,Stderr 、。如

fn main() {
    std::process::Command::new("sleep)
      .arg("8")
      .stdout(Stdio::piped())
      .stdin(Stdio::null())
      .stderr(Stdio::null())
      .spawn()
      .unwrap();
}

这可以解决阻塞问题。

编辑

经过一些探索后,/ bin / bash的使用不起作用。子命令从未触发。但是Stdout,Stdin和Stderr的管道工作正常。