Crate mio_child_process[][src]

A simple crate that allows child processes to be handled with mio

usage

extern crate mio_child_process;
extern crate mio;

use mio::{Poll, Token, Ready, PollOpt, Events, Evented};
use std::process::{Command, Stdio};
use mio_child_process::{CommandAsync, ProcessEvent};
use std::sync::mpsc::TryRecvError;

fn main() {
let mut process = Command::new("ping");
   if cfg!(target_os = "linux") {
       process.arg("-c").arg("4");
   }
   let mut process = process.arg("8.8.8.8")
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn_async()
        .expect("Could not spawn process");
    let poll = Poll::new().expect("Could not spawn poll");
    let mut events = Events::with_capacity(10);
    let token = Token(1);
    process.register(&poll, token, Ready::all(), PollOpt::edge()).expect("Could not register");
    'outer: loop {
        poll.poll(&mut events, None).expect("Could not poll");
        for event in &events {
            assert_eq!(event.token(), token);
            loop {
                let result = match process.try_recv() {
                    Ok(r) => r,
                    Err(TryRecvError::Empty) => continue,
                    Err(TryRecvError::Disconnected) => panic!("Could not receive from process"),
                };
                println!("{:?}", result);

                match result {
                    ProcessEvent::Exit(exit_status) => {
                        assert!(exit_status.success());
                        break 'outer;
                    },
                    ProcessEvent::IoError(_, _) | ProcessEvent::CommandError(_) => {
                        assert!(false);
                    },
                    _ => {}
                }
            }
        }
    }
}

Notes

StdioChannel::Stdout will only be emitted when .stdout(Stdio::piped()) is passed to the Command.

StdioChannel::Stderr will only be emitted when .stderr(Stdio::piped()) is passed to the Command.

Threads

Internally a thread gets spawned for each std stream it's listening to (stdout and stderr). Another thread is started, that is in a blocking wait until the child process is done. This means that mio-child-process uses between 1 to 3 threads for every process that gets started.

Structs

Process

An async child process

Enums

ProcessEvent

An event received from the child process

StdioChannel

Describes what channel the ProcessEvent came from.

Traits

CommandAsync

Extension trait to implement an async spawner on the Command struct