如何避免stdin和stdout上的缓冲?

时间:2014-12-14 22:11:12

标签: rust

std::io::stdin()读取时,输入会被缓冲,直到遇到EOF。我希望在线路到达时处理线路,而不是等待一切都被缓冲。

鉴于shell函数bar每秒运行echo bar,我会使用bar | thingy对此进行测试。在我^C之前,它不会打印任何内容。

以下是我目前正在使用的内容:

use std::io;
use std::io::timer;
use std::time::Duration;

fn main() {
    let mut reader = io::stdin();
    let interval = Duration::milliseconds(1000);

    loop {
        match reader.read_line() {
            Ok(l) => print!("{}", l),
            Err(_) => timer::sleep(interval),
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

从std :: io :: stdin()读取时,输入被缓冲直到遇到EOF

为什么这么说?您的代码似乎可以按您的意愿工作。如果我编译并运行它:

$ ./i
hello
hello

goodbye
goodbye

yeah!
yeah!

每一行中的第一行是我在终端输入并按下输入(这是read_line查找的内容)。第二个是你的程序输出的内容。

Err(_) => timer::sleep(interval)

这是一个坏主意 - 当输入关闭时(例如使用^D),您的程序不会终止。

修改

我创建了一个脚本bar

#!/bin/bash

set -eu

i=0

while true; do
    echo $i
    sleep 1
done

然后运行它:

./bar | ./i
0

0

0

您的计划继续有效。