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)
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