✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Rust开发,Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Rust高性能并发编程
景天的主页:景天科技苑
Rust多进程
一、Rust进程
在系统编程中,进程(Process)是一个基本而重要的概念。在 Rust 中,我们可以使用标准库 std::process 来启动、管理和与子进程进行通信。
本文将深入讲解如何在 Rust 中使用 std::process 模块创建和控制子进程,并提供实际案例帮助你掌握其用法。
二、std::process 模块简介
Rust 提供了以下几个核心类型用于进程管理:
std::process::***mand:用于配置和启动新进程
std::process::Child:表示运行中的子进程
std::process::ExitStatus:子进程的退出状态
std::process::Output:表示完整子进程输出
std::process::Stdio:用于标准输入输出重定向
这些类型构成了 Rust 进程操作的主干。
三、创建子进程(***mand 和 spawn)
3.1 最简单的例子
use std::process::***mand;
fn main() {
//创建子进程
//***mand::new()的参数是要执行的命令
//arg()的参数是命令的参数
//status()返回一个Result<ExitStatus, io::Error>
let status = ***mand::new("ls").arg("-la").status().expect("failed to execute process");
//打印子进程的退出状态
println!("Process exited with: {}", status);
}
包含退出状态码和命令执行的标准输出结果
该代码会启动 ls -la 子进程并等待其退出。
3.2 ***mand 的常用方法
arg(&str) 添加单个参数
args(&[&str]) 添加多个参数
env() 设置环境变量
envs(iter) 批量设置多个环境变量(接受 key-val 对)
env_remove(key) 移除一个环境变量
env_clear() 清除继承的环境变量
current_dir() 设置工作目录
stdin(Stdio) 配置子进程的标准输入
stdout(Stdio) 配置子进程的标准输出
stderr(Stdio) 配置子进程的标准错误
常用的 Stdio 构造函数:
Stdio::inherit():继承父进程(默认行为)
Stdio::piped():用管道连接,可以读写
Stdio::null():忽略该流
***mand::new(“cat”).stdin(Stdio::piped());
执行进程的方法
spawn() std::process::Child 启动子进程(非阻塞)
status() std::process::ExitStatus 等待进程完成并返回状态
output() std::process::Output 等待进程并捕获 stdout 和 stderr
arg0() 设置 argv[0](对程序看到的名称)
其他辅助方法
arg0(name) 设置 argv[0],用于伪装程序名
uid(uid: u32) 设置子进程的用户 ID(Unix)
gid(gid: u32) 设置组 ID(Unix)
before_exec() 设置进程启动前的钩子(危险,需 unsafe)
这些方法仅在特定平台(如 Unix)生效。
示例:设置环境变量和工作目录
***mand::new("echo")
.arg("$MY_VAR")
.env("MY_VAR", "HelloRust")
.current_dir("/tmp")
.status()
.expect("failed");
四、捕获输出(Output 和管道)
使用 output() 方法可以捕获 stdout 和 stderr:
use std::process::***mand;
fn main() {
//获取子进程的输出
let output = ***mand::new("echo").arg("hello world").output().expect("failed to execute");
//打印子进程状态
println!("status: {}", output.status);
//打印子进程的标准输出
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
//打印子进程的标准错误
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));
}
4.1 与 spawn() 的对比
output():阻塞直到进程退出并返回所有输出
spawn():返回 Child,可以异步控制进程
4.2 异步读取子进程输出
use std::process::{
***mand, Stdio };
use std::io::{
BufReader, BufRead };
fn main() {
// 创建子进程
let mut child = ***mand::new("ping")
.arg("localhost")
.stdout(Stdio::piped</