Rust Darwin系统进程管理库darwin-libproc的使用,提供macOS进程信息查询与系统调用功能
Rust Darwin系统进程管理库darwin-libproc的使用,提供macOS进程信息查询与系统调用功能
简介
darwin-libproc 是 macOS 系统 libproc
库的 Rust 绑定,提供了安全且符合 Rust 习惯的接口。
安装
在 Cargo.toml 中添加以下依赖:
darwin-libproc = "0.2.0"
或者运行以下命令:
cargo add darwin-libproc
完整示例代码
以下是一个使用 darwin-libproc 查询 macOS 进程信息的完整示例:
use darwin_libproc;
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 获取所有进程ID
let pids = darwin_libproc::proc_listpids(darwin_libproc::ProcType::ProcAllPIDS)?;
println!("Found {} running processes", pids.len());
// 遍历前10个进程
for &pid in pids.iter().take(10) {
// 获取进程名称
let name = darwin_libproc::proc_name(pid)?;
// 获取进程路径
let path = match darwin_libproc::proc_pidpath(pid) {
Ok(p) => p,
Err(_) => "Unknown".to_string()
};
// 获取进程信息
let info = darwin_libproc::proc_pidinfo(
pid,
darwin_libproc::ProcInfo::ProcTaskAllInfo,
0
)?;
println!("PID: {}, Name: {}, Path: {}", pid, name, path);
println!("Info: {:?}\n", info);
}
Ok(())
}
功能说明
proc_listpids
- 获取所有进程ID列表proc_name
- 获取指定进程的名称proc_pidpath
- 获取进程的执行路径proc_pidinfo
- 获取详细的进程信息
许可证
该项目采用双重许可:
- Apache License 2.0
- MIT license
平台支持
仅支持 macOS 平台,最低 Rust 版本要求为 1.36+。
完整示例代码扩展
以下是一个更完整的进程管理器示例,包含更多功能和错误处理:
use darwin_libproc;
use std::error::Error;
use std::process;
fn main() -> Result<(), Box<dyn Error>> {
// 获取当前进程ID
let current_pid = process::id() as i32;
println!("Current PID: {}", current_pid);
// 获取所有进程ID
let pids = match darwin_libproc::proc_listpids(darwin_libproc::ProcType::ProcAllPIDS) {
Ok(pids) => pids,
Err(e) => {
eprintln!("Failed to get process list: {}", e);
return Err(e.into());
}
};
println!("Total running processes: {}", pids.len());
// 过滤系统进程(通常PID < 100)
let user_pids: Vec<_> = pids.iter().filter(|&&pid| pid > 100).collect();
println!("\nUser processes (PID > 100):");
for &pid in user_pids.iter().take(5) {
match get_process_info(pid) {
Ok(info) => println!("{:?}", info),
Err(e) => eprintln!("Error getting info for PID {}: {}", pid, e),
}
}
Ok(())
}
struct ProcessInfo {
pid: i32,
name: String,
path: String,
threads: usize,
}
fn get_process_info(pid: i32) -> Result<ProcessInfo, Box<dyn Error>> {
let name = darwin_libproc::proc_name(pid)?;
let path = darwin_libproc::proc_pidpath(pid)?;
// 获取线程数量
let task_info = darwin_libproc::proc_pidinfo(
pid,
darwin_libproc::ProcInfo::ProcTaskAllInfo,
0
)?;
let threads = unsafe { (*task_info).ptinfo.pti_threadnum as usize };
Ok(ProcessInfo {
pid,
name,
path,
threads,
})
}
功能扩展说明
- 获取当前进程ID
- 过滤系统进程
- 更完善的错误处理
- 结构化进程信息输出
- 获取线程数量信息
- 自定义ProcessInfo结构体
1 回复
Rust Darwin系统进程管理库darwin-libproc的使用
简介
darwin-libproc
是一个Rust库,提供了对macOS(Darwin)系统进程管理的接口封装,允许开发者查询进程信息并进行相关系统调用。这个库是对macOS原生libproc
库的Rust绑定,提供了更安全、更方便的Rust接口。
主要功能
- 获取进程列表
- 查询进程信息(名称、路径、PID等)
- 获取进程参数和环境变量
- 进程状态查询
- 其他macOS特有的进程管理功能
使用方法
添加依赖
首先在Cargo.toml
中添加依赖:
[dependencies]
darwin-libproc = "0.1"
基本示例
1. 获取所有进程PID
use darwin_libproc::processes;
fn main() {
match processes::all_pids() {
Ok(pids) => {
println!("Running processes (PID count: {}):", pids.len());
for pid in pids {
println!("{}", pid);
}
}
Err(e) => eprintln!("Error getting PIDs: {}", e),
}
}
2. 获取进程名称
use darwin_libproc::process;
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::name(pid) {
Ok(name) => println!("Process name for PID {}: {}", pid, name),
Err(e) => eprintln!("Error getting process name: {}", e),
}
}
3. 获取进程完整路径
use darwin_libproc::process;
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::path(pid) {
Ok(path) => println!("Process path for PID {}: {}", pid, path),
Err(e) => eprintln!("Error getting process path: {}", e),
}
}
4. 获取进程参数
use darwin_libproc::process;
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::args(pid) {
Ok(args) => {
println!("Arguments for PID {}:", pid);
for arg in args {
println!("- {}", arg);
}
}
Err(e) => eprintln!("Error getting process arguments: {}", e),
}
}
5. 获取进程环境变量
use darwin_libproc::process;
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::env(pid) {
Ok(env_vars) => {
println!("Environment variables for PID {}:", pid);
for (key, value) in env_vars {
println!("{}={}", key, value);
}
}
Err(e) => eprintln!("Error getting process environment: {}", e),
}
}
高级用法
获取进程信息结构体
use darwin_libproc::process::{self, ProcInfo};
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::proc_info::<ProcInfo>(pid) {
Ok(info) => {
println!("Process info for PID {}:", pid);
println!("Name: {}", info.name());
println!("Parent PID: {}", info.parent_pid());
println!("Status: {:?}", info.status());
// 其他信息...
}
Err(e) => eprintln!("Error getting process info: {}", e),
}
}
获取线程信息
use darwin_libproc::process;
fn main() {
let pid = 123; // 替换为你想查询的PID
match process::threads(pid) {
Ok(threads) => {
println!("Threads for PID {}:", pid);
for thread in threads {
println!("- Thread ID: {}", thread.thread_id);
// 其他线程信息...
}
}
Err(e) => eprintln!("Error getting threads: {}", e),
}
}
完整示例
下面是一个综合使用darwin-libproc
库的完整示例,展示如何获取当前用户的所有进程信息:
use darwin_libproc::{processes, process};
use std::process::id;
fn main() {
// 获取当前进程PID
let current_pid = id() as i32;
println!("Current process PID: {}", current_pid);
// 获取所有进程PID
match processes::all_pids() {
Ok(pids) => {
println!("Total running processes: {}", pids.len());
// 遍历所有进程并获取基本信息
for pid in pids {
// 跳过无法查询的进程
if let Ok(name) = process::name(pid) {
println!("\nProcess {} (PID: {})", name, pid);
// 获取进程路径
if let Ok(path) = process::path(pid) {
println!(" Path: {}", path);
}
// 获取进程状态
if let Ok(info) = process::proc_info::<process::ProcInfo>(pid) {
println!(" Status: {:?}", info.status());
println!(" Parent PID: {}", info.parent_pid());
}
// 如果是当前进程,显示更多信息
if pid == current_pid {
println!(" [Current Process]");
// 获取当前进程参数
if let Ok(args) = process::args(pid) {
println!(" Arguments:");
for arg in args {
println!(" - {}", arg);
}
}
// 获取当前进程环境变量
if let Ok(env_vars) = process::env(pid) {
println!(" Environment Variables:");
for (key, value) in env_vars {
println!(" {}={}", key, value);
}
}
}
}
}
}
Err(e) => eprintln!("Error getting process list: {}", e),
}
}
注意事项
- 需要macOS系统才能使用此库
- 某些功能可能需要root权限
- 查询其他进程的信息可能需要适当的权限
- 错误处理很重要,因为许多操作可能会失败(如进程不存在、权限不足等)
这个库为macOS系统上的进程管理提供了强大的功能,适合需要深入与系统进程交互的Rust应用程序开发。