相关疑难解决方法(0)

您如何从流程中输出流量?

一般来说,我相信我理解这样做的一种方式:

  • 创建一个 Command
  • 使用Stdio::piped()创建一个新的对输出流
  • 配置command.stdout(),和command.stderr()
  • 产生这个过程
  • 创建一个新线程并将stderr和stdout传递给它< - ???
  • 在远程线程中,不断轮询输入并将其写入输出流.
  • 在主线程中,等待进程完成.

听起来不错吗?

我的两个实际问题:

  1. 是否有一种更简单的方法,不涉及每个进程的"读取线程"?

  2. 如果没有更简单的方法,Read::read()需要&mut self; 你如何将它传递到远程线程?

请提供有关如何实际流式传输输出的具体示例,而不仅仅是有关如何执行此操作的通用建议...

更具体地说,这是使用的默认示例spawn:

use std::process::Command;

let mut child = Command::new("/bin/cat")
                        .arg("file.txt")
                        .spawn()
                        .expect("failed to execute child");

let ecode = child.wait()
                 .expect("failed to wait on child");

assert!(ecode.success());
Run Code Online (Sandbox Code Playgroud)

如何更改上面的示例以将child的输出流式传输到控制台,而不是仅仅等待退出代码?

rust

11
推荐指数
2
解决办法
1849
查看次数

如何为命令 stdout 添加 [stdout] 和 [sterr] 前缀?

使用Command struct,如何向 stdout 和 stderr 缓冲区添加前缀?

我希望输出看起来像这样:

[stdout] things are good.
[sterr] fatal: repository does not exist.
Run Code Online (Sandbox Code Playgroud)

这也很适合应用于程序的主标准输出,因此程序打印的任何内容都带有这样的前缀。

这是我目前拥有的代码:

let output = Command::new("git").arg("clone").output().unwrap_or_else(|e| {
    panic!("Failed to run git clone: {}", e)
});
Run Code Online (Sandbox Code Playgroud)

rust

5
推荐指数
1
解决办法
2228
查看次数

标签 统计

rust ×2