gpt4 book ai didi

rust - 创建复制主进程 stderr 的子进程

转载 作者:行者123 更新时间:2023-11-29 08:27:41 25 4
gpt4 key购买 nike

有没有一种稳定的方法可以创建一个卡在后台并继承 stderr 的子进程,进进出出?据我所知,创建一个 child需要我启动一个单独的程序。相反,我想创建一个与主进程一样长的子进程,并且只用于允许我复制 stderr,以便我可以从中读取。

下面是在链接中创建进程的例子

use std::process::Command;

let output = Command::new("sh")
.arg("-c")
.arg("echo hello")
.output()
.unwrap_or_else(|e| { panic!("failed to execute process: {}", e) });
let hello = output.stdout;

喜欢做什么

use std::process::Command;

let leech = Command::new() // create process that hangs out in the background and inherits stderr, stdin and stdout from main process

// ....

// panic occurs somewhere in the program
if thread::panicking {
output = leech.output().stderr();
}
// screen clears

// print stderr of output

我需要创建一个水蛭,因为显示在主屏幕上的 panic 由于终端图形而被刷新。该库将清除屏幕,在此过程中清除紧急消息,如果我能够复制 stderr 并以某种方式读取它,我可以在终端恢复预程序运行状态后重新打印紧急消息。

最佳答案

我相信使用包装程序更容易做到这一点,而不是从 rust 程序本身启动一些东西。以下是如何使用 shell 脚本执行此操作的示例:

#!/bin/bash

# Redirection magic from http://stackoverflow.com/a/6317938/667984
{ errors=$(./my_rust_program 2>&1 1>&$original_out); } {original_out}>&1

if [[ $? -ne 0 ]]; then
echo
echo "--terminal reset shenanigans--"
echo
echo "$errors" >&2
fi

与此 rust 程序一起使用时:

fn main() {
println!("Normal program output");
panic!("oops");
}

它打印:

Normal program output

--terminal reset shenanigans--

thread '<main>' panicked at 'oops', my_rust_program.rs:3

我相信你也可以在 stable rust 中创建一个,但是既然你在你的问题中提到了 sh 我假设你无论如何都在 unix 环境中,shell 脚本版本应该更简单。

关于rust - 创建复制主进程 stderr 的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com