gpt4 book ai didi

rust - std::process,带有来自缓冲区的 stdin 和 stdout

转载 作者:行者123 更新时间:2023-12-05 01:27:07 24 4
gpt4 key购买 nike

我有一个命令 cmd和三个 Vec<u8> : buff1 , buff2 , 和 buff3 .我要执行 cmd , 使用 buff1作为stdin ,并捕获 stdout进入buff2stderr进入buff3 .我想在不显式写入任何临时文件的情况下完成所有这些工作。

std::process似乎允许所有这些事情,只是不是同时发生。

如果我使用 Command::new(cmd).output()它将返回 stdout 的缓冲区和 stderr , 但没办法给它 stdin .

如果我使用 Command::new(cmd).stdin(Stdio::piped()).spawn()那我可以child.stdin.as_mut().unwrap().write_all(buff1)但我无法捕获 stdoutstderr .

据我所知,无法调用 Command::new(cmd).stdout(XXX)明确告诉它捕获 stdout在缓冲区中,它默认使用 .output() 的方式.

看起来像这样的事情应该是可能的:

Command::new(cmd)
.stdin(buff1)
.stdout(buff2)
.stderr(buff3)
.output()

因为 Rust 生成一个 Vec<u8>看起来像File ,但是 Vec没有实现 Into<Stdio>

我错过了什么吗?有没有办法做到这一点,还是我需要用实际文件读写?

最佳答案

如果您可以使用外部库, subprocess crate 支持这个用例:

let (buff2, buff3) = subprocess::Exec::cmd(cmd)
.stdin(buff1)
.communicate()?
.read()?;

使用 std::process::Command 执行此操作比看起来更棘手,因为操作系统并不容易将内存区域连接到子进程的标准输入。连接一个文件或任何类似文件的东西很容易,但是要将一大块内存提供给子进程,你基本上必须 write()在一个循环中。同时 Vec<u8>执行std::io::Read , 你不能用它来构造一个实际的 File (或任何其他包含文件描述符/句柄的内容)。

将数据馈送到子进程,同时读取其输出有时称为通信,引用 Python method 2004 年与当时的新 subprocess 一起推出Python 2.4 模块。您可以使用 std::process 自己实现它,但是您需要小心避免死锁,以防在您尝试向命令提供输入时命令生成输出。 (例如,将一大块数据提供给子进程然后读取其标准输出和标准错误的简单循环很容易出现这种死锁。)documentation描述了一种仅使用标准库即可安全实现它的可能方法。

关于rust - std::process,带有来自缓冲区的 stdin 和 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69780431/

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