当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Stdio.piped用法及代码示例


本文简要介绍rust语言中 std::process::Stdio.piped 的用法。

用法

pub fn piped() -> Stdio

应该安排一个新的管道来连接父进程和子进程。

例子

使用标准输出:

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

let output = Command::new("echo")
    .arg("Hello, world!")
    .stdout(Stdio::piped())
    .output()
    .expect("Failed to execute command");

assert_eq!(String::from_utf8_lossy(&output.stdout), "Hello, world!\n");
// Nothing echoed to console

使用标准输入:

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

let mut child = Command::new("rev")
    .stdin(Stdio::piped())
    .stdout(Stdio::piped())
    .spawn()
    .expect("Failed to spawn child process");

let mut stdin = child.stdin.take().expect("Failed to open stdin");
std::thread::spawn(move || {
    stdin.write_all("Hello, world!".as_bytes()).expect("Failed to write to stdin");
});

let output = child.wait_with_output().expect("Failed to read stdout");
assert_eq!(String::from_utf8_lossy(&output.stdout), "!dlrow ,olleH");

将超过管道缓冲区的输入值写入 stdin 而不同时读取 stdout 和 stderr 可能会导致死锁。当运行任何不能保证在写入超过管道缓冲区的输出值之前读取其整个标准输入的程序时,这是一个问题。管道缓冲区的大小因目标而异。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::process::Stdio.piped。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。