Как избежать буферизации на stdin и stdout?
При чтении из std::io::stdin()
входные данные буферизуются до EOF
встречается. Я хотел бы обрабатывать строки по мере их поступления, а не ждать, пока все буферизуется.
Дана функция оболочки 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 ответ
При чтении из std::io::stdin() ввод буферизуется до тех пор, пока не встретится EOF
Почему ты говоришь это? Ваш код работает так, как вы хотите. Если я скомпилирую и запусту это:
$ ./i
hello
hello
goodbye
goodbye
yeah!
yeah!
Первая из каждой пары строк - я набираю в терминале и нажимаю Enter (вот что 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
Ваша программа продолжает работать.