如果你需要等候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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐