процесс и забираю его stderr в BufReader:
world.app_handler = Some(
Command::new(&world.app_bin)
.stderr(Stdio::piped())
.spawn()
.unwrap(),
);
let app_stderr = world.app_handler.as_mut().unwrap().stderr.take().unwrap();
world.app_reader = Some(BufReader::new(app_stderr));
далее в этом же методе я с помощью такой функции ожидаю пока запущенный процесс напишет что-то в консоль и после этого продолжаю, этот момент работает исправно:
pub fn wait_process_output(
reader: &mut BufReader<ChildStderr>,
output: Vec<(String, u16)>,
) -> Result<(), String> {
let mut process_output = String::new();
loop {
match reader.read_line(&mut process_output) {
Err(e) => {
return Err(format!("Unable to read output: {}", e));
}
Ok(_) => {
// processing here
}
};
}
}
проблема начинается когда некоторое время спустя в другом методе я опять вызываю
wait_process_output на world.app_reader: он просто бесконечно ждет , BufReader ничего не считывает
в чем может быть проблема? как так получается, что BufReader портится?
наверное тут еще стоит отметить, что происходит это все в тестах на cucumber, соответственно первый раз метод wait_process_output вызывается в given, а второй раз в then в рамках одного сценария
не уверен что это важно, но все же
UPD обнаружил, что буфер читается, но не так как я ожидал по всей видимости если в stderr было положено что-то ДО того как я вызвал read_line, то это считано не будет а я думал что эти данные просто складируются в буфер до вызова read_line либо до исчерпания буфера получается что нет способа получить то, что процесс вывел в stderr до того как я стал ждать с помощью read_line?
Обсуждают сегодня