你将如何从Rust中的Process流输出?

时间:2014-10-24 15:16:36

标签: rust rust-obsolete

这个问题是指2014年10月的Rust。

如果您使用的是Rust 1.0或更高版本,最好在别处寻找解决方案。


我有一个长时间运行的Rust进程,它会生成我使用Process运行的日志值。

虽然看起来我可以定期"检查"使用set_timeout()wait()运行的过程,并执行某种高级循环,如:

let mut child = match Command::new("thing").arg("...").spawn() {
    Ok(child) => child,
    Err(e) => fail!("failed to execute child: {}", e),
};
loop {
    child.set_timeout(Some(100));
    match child.wait() {
        // ??? Something goes here
    }
}

我不是百分之百的事情是;如何判断超时错误与wait()的进程返回错误之间的区别,以及如何使用PipeStream进行尽可能多的读取而不阻止来自流& #34;推出的每个时间间隔。

这是最好的方法吗?我应该开始监视stdout和stderr的任务吗?

1 个答案:

答案 0 :(得分:5)

为了区分进程中的错误和超时,你必须管理wait的返回,这里有一个例子:

fn run() {
    let mut child = match Command::new("sleep").arg("1").spawn() {
        Ok(child) => child,
        Err(e) => fail!("failed to execute child: {}", e),
    };
    loop {
        child.set_timeout(Some(1000));
        match child.wait() {
            // Here assume any error is timeout, you can filter from IoErrorKind
            Err(..) => println!("Timeout"),
            Ok(ExitStatus(0)) => {
                println!("Finished without errors");
                return;
            }
            Ok(ExitStatus(a)) => {
                println!("Finished with error number: {}", a);
                return;
            }
            Ok(ExitSignal(a)) => {
                println!("Terminated by signal number: {}", a);
                return;
            }
        }
    }
}

关于使用流,检查wait_with_output,或实现与渠道和线程类似的东西:http://doc.rust-lang.org/src/std/home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libstd/io/process.rs.html#601

希望有所帮助