2014-11-19 5 views
1

Я хотел бы сохранить std :: io :: process :: Процесс внутри структуры в ржавчине. Тем не менее, программа перестает функционировать, как только я передаю экземпляр процесса в структуру. Почему это? Код:Как сохранить процесс в ржавчине

use std::io::process::{Command, Process}; 
use std::rc::Rc; 
use std::cell::RefCell; 

struct DzenInst { 
    process: Rc<RefCell<Process>> 
    //stdin: std::io::pipe::PipeStream 
} 

impl DzenInst { 
    // Write a string to the stdin of dzen 
    fn write(&mut self, s : String) { 
     let mut stdin = self.process.borrow_mut().stdin.take().unwrap(); 
     println!("Writing to dzen inst"); 
     match stdin.write_str((s + "\n").as_slice()) { 
      Err(why) => panic!("couldn't write to dzen stdin: {}", why.desc), 
      Ok(_) => println!("Wrote string to dzen"), 
     }; 
    } 
} 

fn CreateDzen() -> DzenInst { 
    DzenInst {process: Rc::new(RefCell::new(
       match Command::new("dzen2").spawn() { 
        Err(why) => panic!("couldn't spawn dzen: {}", why.desc), 
        Ok(process) => process, 
       }))} 
} 

fn main() { 
    let mut d1 = CreateDzen(); 
    d1.write("Test".to_string()); 

    std::io::timer::sleep(std::time::duration::Duration::seconds(1));  
} 

Если я пишу в процессе стандартного ввода сразу внутри CreateDzen, то он работает нормально (т.е. программа не идет несуществующей). Я предполагаю, что копирование экземпляра Process вызывает вызов деструктора, который закрывает процесс. Любые идеи о том, как сохранить экземпляр Process, не приводя к исчезновению процесса?

+0

Что именно это выход? Кажется правильным для меня, учитывая ваш точный код, но с 'dzen2' изменен на' cat', потому что у меня нет dzen2. –

ответ

2

Ваш код ржавчины в порядке. Проблема здесь dzen2. Вы должны добавить флаг -p, чтобы сделать dzen2 persist EOF (который находится в dzen2 README).

Вместо

match Command::new("dzen2").spawn() { 

Использование

match Command::new("dzen2").arg("-p").spawn() { 
+0

Ах да, правда. На самом деле, было бы лучше не закрывать stdin для начала, чего я достиг, не используя take() на Option . – MHOOO