现在我正试图创建一个运行vlc的程序,然后退出rust程序。
以下是我目前的实现:
use anyhow::{Context, Result};
fn play_vlc(music_path: &str, vlc_args: &[&str]) -> Result<()> {
let vlc_process = process::Command::new("vlc")
.current_dir(music_path)
.args(vlc_args)
.output()
.with_context(|| "Error trying to play music")?;
std::process::exit(0);
Ok(())
}
这很好,但由于vlc是一个连续的过程,它永远不会到达std::process::exit(0)
,因此程序一直在运行。
我尝试了.spawn()
而不是.output()
,它允许用户手动关闭rust进程,并且仍然运行vlc进程。但我希望锈蚀过程自动关闭,现在有一堆来自vlc的输出。
文档真的很好。阅读它们。您所说的所有内容都是预期行为:.output()
等待子进程完成。.spawn()
允许命令在保留为默认值时继承stdin、stdout和stderr。这意味着,vlc上的stdout将与Rust进程中的stdout相同。如果你的流程可以println!
一些东西,那么vlc也可以,它会去同一个地方。
现在该如何绕过它?从本质上讲,您将希望做与>/dev/null
在您的shell中所做的相同的事情。.stdout(…)
允许配置stdout发生的情况,如果您想将其重定向到任何位置:
.stdout(process::Stdio::null())
.stderr(process::Stdio::null())
.spawn()
看到这是std提供的,我有点惊讶,我预计这需要一些依赖于平台的操作。你真幸运。