由于文件和流在被删除时会自动关闭,但io::stdin()
仅提供基础流的句柄,我无法看到如何明确关闭stdin
或stdout
或检测在我的程序中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
?
答案 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,消除了两个进程之间死锁的可能性。