关闭stdout或stdin

时间:2015-06-11 09:15:57

标签: rust

由于文件和流在被删除时会自动关闭,但io::stdin()仅提供基础流的句柄,我无法看到如何明确关闭stdinstdout或检测在我的程序中stdin上的EOF。

考虑

fn main() {
    let mut stdin = io::stdin();
    let mut linebuffer = String::new();
    loop {
        match stdin.read_line(&mut linebuffer) {
            Ok(i) if i == 0 => { break; },
            Ok(i) => {
                println!("{} {}", linebuffer, i);
            },
            Err(e) => { panic!(e); }
        }
        linebuffer.clear();
    }
}

检查放入缓冲区的字节数似乎是不稳定的,因为管道可能会被写入其中的零字节刷新。从已关闭的stdin进行阅读应该会导致IOError,但事实并非如此。

与此有点相关:如何明确关闭我自己的stdout / stderr

2 个答案:

答案 0 :(得分:3)

前一段时间,当源流关闭时,在读取操作时发出了ErrorKind::EndOfFile枚举变量。它似乎没有进入新的I / O库实现,而是Read特征已更改为在EOF时返回0读取字节。事实上,这在I / O改革RFC中是specified。所以是的,检查零是检测当前Rust中流结束的有效方法。

顺便说一下,您可以写Ok(0)代替Ok(i) if i == 0

match stdin.read_line(&mut buf) {
    Ok(0) => break,
    ...
}

关于如何关闭stdout() / stderr(),不幸的是,似乎当前的API并没有提供一种方法。它可能是一个值得RFC或至少是RFC问题的功能。

答案 1 :(得分:1)

关于我自己关于如何关闭stdout / stderr的子问题:正确的方法是在MY_SEG上使用wait - 或wait_with_output - 方法。两个方法在等待它退出之前关闭子进程的stdin,消除了两个进程之间死锁的可能性。