Канали
Структура 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),
}
}