es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede leer stderr dos veces en Rust.

Por alguna razón, no puedo leer desde el stderr del proceso hijo la segunda vez. Esto es lo que hago.

Estoy creando un proceso hijo para las pruebas de cucumber. En el primer paso, creo el proceso, tomo su stderr, lo guardo y luego leo desde él. Aquí está el código:

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!("No se puede leer la salida: {}", e));
            }
            Ok(_) => {
                // procesamiento aquí
            }
        };
    }
}
pub fn step1(world: &mut TestWorld) {
    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));
    wait_process_output(world.app_reader.as_mut().unwrap(), /* datos esperados */).ok();
}

Este código funciona correctamente: se lee el stderr como se espera.

En el tercer paso de la prueba, intento leer la salida del proceso una vez más:

pub fn step3(world: &mut TestWorld) {
    wait_process_output(world.app_reader.as_mut().unwrap(), /* datos esperados */).ok();
}

Esta vez, reader.read_line se queda colgado infinitamente: no se está leyendo nada. Estoy seguro de que el proceso hijo produce alguna salida: puedo verlo si lo ejecuto en las mismas condiciones por separado.

¿Podría sugerir alguna idea de por qué el objeto BufReader se corrompe cuando intento leer de él por segunda vez?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no tengo acceso a todo el contexto del código y, por lo tanto, no puedo proporcionar una respuesta concreta. Sin embargo, aquí hay algunas ideas que podrían ayudar a resolver el problema:

    • Asegúrate de que el proceso secundario siga en ejecución cuando intentas leer desde su stderr por segunda vez.
    • Intenta restablecer el objeto BufReader antes de leer desde él por segunda vez. Puedes hacer esto llamando a BufReader::get_mut() para obtener una referencia mutable al lector subyacente y luego llamando a Seek::seek() en él para establecer la posición actual en 0.
    • Comprueba si hay algún problema con la canalización del stderr. Puedes intentar canalizar también el stdout y ver si puedes leer desde él por segunda vez.
    • Asegúrate de que no haya interferencia de otras partes del código. Intenta aislar el problema simplificando el código y eliminando cualquier código no relacionado que pueda estar causando el problema.

    Esperemos que una de estas ideas ayude a resolver el problema.

Comments are closed.