首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭标准或标准

关闭标准或标准
EN

Stack Overflow用户
提问于 2015-06-11 09:15:57
回答 2查看 2.3K关注 0票数 7

由于文件和流在被删除时会自动关闭,但是io::stdin()只为底层流提供句柄,因此我无法在程序中显式关闭stdinstdout或检测stdin上的EOF。

考虑一下

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-11 09:57:18

不久前,有一个ErrorKind::EndOfFile枚举变量,它是在源流关闭时在读取操作时发出的。它似乎没有进入新的I/O库实现,而是将Read特性更改为在EOF上返回0读字节。事实上,这就是I/O改革中的规定。因此,是的,检查零是检测当前锈蚀中流结束的有效方法。

顺便说一句,您可以编写Ok(0)而不是Ok(i) if i == 0

代码语言:javascript
复制
match stdin.read_line(&mut buf) {
    Ok(0) => break,
    ...
}

至于如何关闭stdout()/stderr(),遗憾的是,当前的API似乎没有提供一种方法。它可能是一个值得RFC或至少一个RFC发行的特性。

票数 3
EN

Stack Overflow用户

发布于 2015-06-13 08:13:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30776520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档