【问题标题】:Pipe between two child processes两个子进程之间的管道
【发布时间】:2021-12-02 19:36:09
【问题描述】:

我想在两个子进程之间实现管道来执行env | grep USER 之类的东西。这是我已经拥有但不起作用的:

let mut child1 = Command::new(cmd1)
    .args(args1)
    .stdout(Stdio::piped())
    .spawn()
    .unwrap();

let pipe = child1.stdout.take().unwrap();
let mut child2 = Command::new(cmd2)
    .args(args2)
    .stdin(pipe)
    .stdout(Stdio::piped())
    .spawn()
    .unwrap();

它没有显示任何错误。

【问题讨论】:

  • Stdio::piped 使您的 Rust 父进程位于管道的另一端。这不是你想要的。对于child1,另一侧应该是child2,并且父级根本不应该打开任何FIFO副本。
  • 看看doc.rust-lang.org/std/process/struct.Stdio.html#method.from-2——这个例子正是你需要的。
  • 如果上面的链接为您提供了回答您自己的问题所需的信息,请考虑使用“添加答案”按钮添加描述如何解决问题的答案。 (如果我有时间复制/测试,我会自己这样做,但我现在正在工作,所以如果你有机会的话,你获得荣誉/获得互联网积分是有意义的)。
  • 是的,我正在努力让它发挥作用。

标签: rust pipe


【解决方案1】:

这是我在以下人员的帮助下找到的解决方案:How to implement redirection of stdout of a child process to a file?

我对 Rust 的了解很少,但我会尝试解释一下。我将这段代码解释为好像是用 C 编写的:使用pipe(),我创建了一个fd。然后,使用from_raw_fd()——这是我不知道我是否理解的东西——我将stdinstdout fd 的所有权赋予两个变量,我稍后用它们来替换第一个命令的输出以及将两个程序与管道连接起来的第二个命令的输入。

这是最终代码:

use std::process::{Command, Stdio};
use std::os::unix::io::FromRawFd;
use nix::unistd::pipe;


let fd = pipe().unwrap();

let (pipe_in,pipe_out) = unsafe {
    (Stdio::from_raw_fd(fd.0),
    Stdio::from_raw_fd(fd.1))
};


let child1 = Command::new(cmd2.1)
    .args(cmd2.0)
    .stdout(pipe_out)
    .spawn()
    .unwrap();

let mut child2 = Command::new(cmd1.1)
    .args(cmd1.0)
    .stdin(pipe_in)
    .spawn()
    .unwrap();


child2.wait().unwrap();

我希望有人觉得它有用。

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多