在 Rust 中写入子进程的标准输入?

问题描述 投票:0回答:2

Rust 的

std::process::Command
允许通过
stdin
方法配置进程的 stdin,但该方法似乎只接受现有文件或管道。

给定一个字节片,您将如何将其写入

Command
的标准输入?

rust subprocess exec stdin
2个回答
44
投票

您可以创建一个标准输入管道并在其上写入字节。

  • 由于
    Command::output
    会立即关闭标准输入,因此您必须使用
    Command::spawn
  • Command::spawn
    默认继承stdin。您必须使用
    Command::stdin
    来更改行为。

这是示例(游乐场):

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

fn main() -> io::Result<()> {
    let mut child = Command::new("cat")
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .spawn()?;

    let child_stdin = child.stdin.as_mut().unwrap();
    child_stdin.write_all(b"Hello, world!\n")?;
    
    let output = child.wait_with_output()?;

    println!("output = {:?}", output);

    Ok(())
}

-1
投票

您需要在创建子流程时请求使用管道。 然后您可以写入管道的写入端,以便将数据传递给子进程。

或者,您可以将数据写入临时文件并指定一个

File
对象。 这样,您就不必将数据分段提供给子进程,如果您还从其标准输出中读取数据,这可能会有点棘手。 (存在死锁的风险。)

如果继承的描述符用于标准输入,则父进程不一定有能力将数据注入其中。

© www.soinside.com 2019 - 2024. All rights reserved.