Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Канали

Структура std::process::Child представляє дочірній процес і надає дескриптори stdin, stdout і stderr для взаємодії з базовим процесом через канали.

use std::io::prelude::*;
use std::process::{Command, Stdio};

static PANGRAM: &'static str =
"the quick brown fox jumps over the lazy dog\n";

fn main() {
    // Spawn the `wc` command
    let mut cmd = if cfg!(target_family = "windows") {
        let mut cmd = Command::new("powershell");
        cmd.arg("-Command").arg("$input | Measure-Object -Line -Word -Character");
        cmd
    } else {
        Command::new("wc")
    };
    let process = match cmd
                                .stdin(Stdio::piped())
                                .stdout(Stdio::piped())
                                .spawn() {
        Err(why) => panic!("couldn't spawn wc: {}", why),
        Ok(process) => process,
    };

    // Записуємо рядок до `stdin` для `wc`.
    //
    // `stdin` має тип `Option<ChildStdin>`, але оскільки ми знаємо, що цей
    // екземпляр обов'язково має один, ми можемо безпосередньо викликати `unwrap` для нього.
    match process.stdin.unwrap().write_all(PANGRAM.as_bytes()) {
        Err(why) => panic!("couldn't write to wc stdin: {}", why),
        Ok(_) => println!("sent pangram to wc"),
    }

    // Оскільки `stdin` не живе після наведених вище викликів, його `drop`-нуто,
    // і канал закрито.
    //
    // Це дуже важливо, інакше `wc` не почав би обробляти
    // введення, яке ми щойно надіслали.

    // Поле `stdout` також має тип `Option<ChildStdout>`, тож його треба розпакувати.
    let mut s = String::new();
    match process.stdout.unwrap().read_to_string(&mut s) {
        Err(why) => panic!("couldn't read wc stdout: {}", why),
        Ok(_) => print!("wc responded with:\n{}", s),
    }
}