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(())
}

功能说明

  1. proc_listpids - 获取所有进程ID列表
  2. proc_name - 获取指定进程的名称
  3. proc_pidpath - 获取进程的执行路径
  4. 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,
    })
}

功能扩展说明

  1. 获取当前进程ID
  2. 过滤系统进程
  3. 更完善的错误处理
  4. 结构化进程信息输出
  5. 获取线程数量信息
  6. 自定义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),
    }
}

注意事项

  1. 需要macOS系统才能使用此库
  2. 某些功能可能需要root权限
  3. 查询其他进程的信息可能需要适当的权限
  4. 错误处理很重要,因为许多操作可能会失败(如进程不存在、权限不足等)

这个库为macOS系统上的进程管理提供了强大的功能,适合需要深入与系统进程交互的Rust应用程序开发。

回到顶部