#unix #exec #pipe #child-process #fork #posix

unix-exec-output-catcher

用于在子进程中运行可执行文件并捕获UNIX系统上STDOUT和STDERR输出的库。std::process::Command可能是更好的选择。使用此源代码作为如何实现的教育性来源。

9个版本

0.2.4 2021年6月15日
0.2.3 2021年1月10日
0.2.2 2020年11月30日
0.1.3 2020年11月27日

#528 in Unix API


4个crate中使用(通过mac-sys-info

MIT许可证

38KB
620 行代码(不含注释)

unix-exec-output-catcher

用Rust编写的库,在子进程中执行可执行文件并捕获其输出(stdout和stderr)。

⚠️ 与std::process::Command的区别 🚨

std::process::Command在标准库中也执行相同的操作,但有一个例外:我的库可以让你访问stdout、stderr和“stdcombined”。这样,你可以按照它们出现的顺序获得所有输出行。这是此crate的独特功能。请参阅std/process/struct.Command.html#method.output

TL;DR;

fork_exec_and_catch()的调用是阻塞的。如果程序向stdout或stderr产生无限输出,此函数将永远不会返回。如果程序产生1GB的输出,此函数将消耗1GB的内存。请参阅示例目录中的示例代码。请阅读OCatchStrategy中的警告/信息。该策略决定了“STDCOMBINED”的收集方式。

我的"STDCOMBINED"输出(STDOUT + STDERR)会按正确顺序排列吗?

  • OCatchStrategy::StdCombined: 绝对会
  • OCatchStrategy::StdSeparately: 大概会,但没有保证。如果在行之间没有几百微秒的交替打印到STDOUT/STDERR,这很可能是由于调度和内核缓冲区导致STDOUT/STDERR没有正确捕获的顺序。请参阅Rust注释以获取更多信息。

示例

use unix_exec_output_catcher::{fork_exec_and_catch, OCatchStrategy};

fn main() {
    // executes "ls" with "-la" as argument.
    // this is equivalent to running "$ ls -la" in your shell.
    // The line by line output is stored inside the result.
    let res = fork_exec_and_catch(
        "ls", 
        vec!["ls", "-la"], 
        OCatchStrategy::StdSeparately
    );
    println!("{:#?}", res.unwrap());
}

使用的技术/重要关键词

  • Unix(包括但不限于Linux发行版、MacOS)
  • 管道()
  • exec()
  • fork()
  • dup2()

依赖项

~0.4–1.1MB
~22K SLoC