【Rust多进程】征服CPU的艺术:Rust多进程实战指南

【Rust多进程】征服CPU的艺术:Rust多进程实战指南

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,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</
转载请说明出处内容投诉
CSS教程网 » 【Rust多进程】征服CPU的艺术:Rust多进程实战指南

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买