Rust代码示例——20.5.2.进程等候
摘要:Rust代码示例展示了如何通过Command::new("sleep").arg("5").spawn()创建子进程,并使用child.wait()阻塞等待进程结束。关键点包括:1) wait()是阻塞调用,会暂停当前线程;2) 必须调用wait()避免僵尸进程;3) 返回ExitStatus可检查执行结果。代码执行时会暂停5秒,待子进程结束后才打印最
如果你需要等候process::Child完成,你必须调用Child::wait,它会返回一个process::ExitStatus。
use std::process::Command;
fn main() {
let mut child = Command::new("sleep").arg("5").spawn().unwrap();
let _result = child.wait().unwrap();
println!("reached end of main");
}
$ rustc wait.rs && ./wait
# `wait` keeps running for 5 seconds until the `sleep 5` command finishes
reached end of main
内容解析
这段代码展示了如何在Rust中等候子进程执行完成。
主要功能
代码执行了一个执行sleep 5秒的子进程(让进程休眠5秒),然后等候该子进程执行完成后再继续主程序的执行。
代码结构解析
创建子进程
let mut child = Command::new("sleep").arg("5").spawn().unwrap();
使用Command::new(“sleep”)创建sleep命令。
.arg(“5”)添加参数,表示休眠5秒。
.spawn()启动子进程,返回Child结构体。
.unwrap()处理可能的错误(如果进程启动失败)。
等待子进程结束
let _result = child.wait().unwrap();
child.warit()阻塞当前进程,直到子进程结束
返回Result<ExitStatus>,表示子进程的退出状态
_result使用下划线前缀表示暂时不关心返回值
打印结束信息
println!("reached end of main");
这段代码会在子进程结束后执行
关键点
阻塞等待
wait()是阻塞调用,会暂停当前线程直到子进程结束
这与非阻塞的try_wait()不同,后者会立刻返回
进程生命周期
如果不调用wait(),子进程可能会变成“僵尸进程”。
即使Child被销毁,Rust也会自动等待子进程结束。
退出状态
wait()返回ExitStatus可以检查进程是否成功退出。
例如:result.success()会检查是否成功(退出吗为0)
示例输出
$ rustc wait.rs && ./wait
# 程序会在这里暂停5秒
reached end of main
实际应用场景
这种等待子进程完成的模式在以下场景中很有用:
需要确保子进程完成后再继续执行后续操作
需要获取子进程的执行结果或退出状态
在脚本中按顺序执行多个命令
如果需要非阻塞等待,可以使用try_wait(),它会立即返回Ok(Some(status))(如果进程已经结束)、Ok(None)(如果进程仍在运行)或Err(e)(如果出错)。
原文链接地址:Wait - Rust By Example
更多推荐



所有评论(0)