我采取了以下计划来自 Rust 文档std::process::Command。经过一些迭代后它停止工作。
use std::process::Command;
use std::process::Stdio;
fn main() {
loop {
let mut echo_child = Command::new("echo")
.arg("oh no a tpyo")
.stdout(Stdio::piped())
.spawn()
.expect("failed to start 'echo'");
let echo_out = echo_child.stdout.expect("failed to open 'echo' stdout");
let sed_child = Command::new("sed")
.arg("s/tpyo/typo/")
.stdin(Stdio::from(echo_out))
.stdout(Stdio::piped())
.spawn()
.expect("failed to start 'sed'");
let sed_out = sed_child
.wait_with_output()
.expect("failed to wait on 'sed'");
let sed_out_slice = sed_out.stdout.as_slice();
assert_eq!(b"oh no a typo\n", sed_out_slice);
println!("out: {:?}", String::from_utf8_lossy(sed_out_slice));
}
}
每次崩溃时,我都会收到以下输出:
thread 'main' panicked at 'failed to start 'sed': Error { repr: Os { code: 35, message: "Resource temporarily unavailable" } }', src/libcore/result.rs:906:4
根据的文档Child(我从哪里获取这个程序),它说:
没有实施Drop
对于子进程,所以如果你这样做
不能确保Child
退出后它将继续运行,即使
之后Child
子进程的句柄超出了范围。
如何确保每个文件句柄Child
每次迭代后都会发布流程吗?
如果您立即阅读您所引用的段落之后的段落:
Calling wait
(或围绕它的其他函数)将使父进程等到子进程实际退出后再继续。
为了打电话wait
,你需要不动stdout
out of Child
:
let echo_out = echo_child.stdout.take().expect("failed to open 'echo' stdout");
// ...
echo_child.wait().expect("Couldn't wait for echo child");
也可以看看:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)