2015-08-13 1 views
5

Credo di capire, in generale, un modo di fare questo:In che modo eseguire lo streaming da un processo?

  • Creare un Command
  • Usa Stdio::piped() per creare un nuovo paio di uscita flussi
  • Configura command.stdout(), e command.stderr()
  • Spawn il processo
  • Creare un nuovo thread e passare lo stderr e lo stdout ad esso < - ???
  • Nel thread remoto, eseguire il polling continuo per l'input e scriverlo nel flusso di output.
  • Nel thread principale, attendere il completamento del processo.

Suona bene?

Le mie due domande attuali:

  1. C'è un modo più semplice che non comporta un 'filo leggere' per processo?

  2. Se non c'è un modo più semplice, Read::read() richiede &mut self; come lo si passa in una discussione remota?

Si prega di fornire esempi specifici di come lo streaming in realtà l'uscita, non solo consigli generici su come farlo ...

Per essere più precisi, ecco the default example of using spawn:

use std::process::Command; 

let mut child = Command::new("/bin/cat") 
         .arg("file.txt") 
         .spawn() 
         .expect("failed to execute child"); 

let ecode = child.wait() 
       .expect("failed to wait on child"); 

assert!(ecode.success()); 

Come può essere modificato l'esempio precedente per trasmettere l'output di child alla console, invece di aspettare solo un codice di uscita?

+2

SO non è un generatore di tutorial. Hai un ** problema specifico **? –

+1

In generale su SO, al fine di dare un punto di partenza alla conversazione, è meglio che l'OP (tu) fornisca come minimo un esempio di codice che mostri il problema e poi chieda come risolvere il problema. Ad esempio, potresti probabilmente cambiare il tuo "one way of doing this" in un esempio di codice. –

+0

Accetto volentieri qualsiasi esempio di generazione di un processo a esecuzione prolungata e di output in streaming sulla console, con qualunque mezzo. – Doug

risposta

5

Accetto volentieri qualsiasi esempio di generazione di un processo di lunga durata e di output in streaming sulla console, con qualunque mezzo.

Sembra che si desidera Stdio::inherit:

use std::process::{Command, Stdio}; 

fn main() { 
    let mut cmd = 
     Command::new("cat") 
     .args(&["/usr/share/dict/web2"]) 
     .stdout(Stdio::inherit()) 
     .stderr(Stdio::inherit()) 
     .spawn() 
     .unwrap(); 

    // It's streaming here 

    let status = cmd.wait(); 
    println!("Exited with status {:?}", status); 
} 
+0

È in realtà diverso dal comportamento predefinito? – msgmaxim

+0

@msgmaxim È possibile controllare la [documentazione per 'Command :: new'] (https://doc.rust-lang.org/std/process/struct.Command.html#method.new) per vedere quali sono le impostazioni predefinite : * Inherit stdin/stdout/stderr per 'spawn' o' status', ma crea pipe per 'output' *. TL; DR: No, non la penso così. A volte basta essere troppo espliciti o avere la documentazione di nuovo all'OP è tutto ciò che serve. Si noti i commenti sulla domanda originale che chiede un MCVE, cercando di ottenere OP per spiegare ulteriormente il problema. ¯ \\ _ (ツ) _/¯ – Shepmaster