#linux-process #linux #process #procfs #proc #data-structures

procfs-core

linux procfs伪文件系统的数据结构和解析

2个版本

0.16.0 2023年10月29日
0.16.0-RC12023年6月20日

#852 in Unix API

Download history 88460/week @ 2024-04-16 86018/week @ 2024-04-23 80509/week @ 2024-04-30 87197/week @ 2024-05-07 93797/week @ 2024-05-14 107221/week @ 2024-05-21 116640/week @ 2024-05-28 113359/week @ 2024-06-04 108419/week @ 2024-06-11 110664/week @ 2024-06-18 133859/week @ 2024-06-25 120500/week @ 2024-07-02 136831/week @ 2024-07-09 147824/week @ 2024-07-16 169266/week @ 2024-07-23 148997/week @ 2024-07-30

629,646 个月下载量
用于 185 个crate (3个直接使用)

MIT/Apache

305KB
5.5K SLoC

procfs

Crate Docs Minimum rustc version

这个crate是linux上的proc伪文件系统的接口,通常挂载为/proc。从长远来看,这个crate旨在功能完整,但目前并非所有文件都公开。请参阅文档以获取支持信息,或查看代码仓库中的support.md文件。

示例

在文档和代码仓库的examples文件夹中提供了几个示例。

以下是一个示例,它打印出与调用进程相同的tty上运行的进程。这与“ps”在默认模式下的行为非常相似。

fn main() {
    let me = procfs::process::Process::myself().unwrap();
    let me_stat = me.stat().unwrap();
    let tps = procfs::ticks_per_second().unwrap();

    println!("{: >5} {: <8} {: >8} {}", "PID", "TTY", "TIME", "CMD");

    let tty = format!("pty/{}", me_stat.tty_nr().1);
    for prc in procfs::process::all_processes().unwrap() {
        let prc = prc.unwrap();
        let stat = prc.stat().unwrap();
        if stat.tty_nr == me_stat.tty_nr {
            // total_time is in seconds
            let total_time =
                (stat.utime + stat.stime) as f32 / (tps as f32);
            println!(
                "{: >5} {: <8} {: >8} {}",
                stat.pid, tty, total_time, stat.comm
            );
        }
    }
}

以下是一个示例,展示了如何获取当前进程的当前内存使用情况。

use procfs::process::Process;

fn main() {
    let me = Process::myself().unwrap();
    let me_stat = me.stat().unwrap();
    println!("PID: {}", me.pid);

    let page_size = procfs::page_size();
    println!("Memory page size: {}", page_size);

    println!("== Data from /proc/self/stat:");
    println!("Total virtual memory used: {} bytes", me_stat.vsize);
    println!(
        "Total resident set: {} pages ({} bytes)",
        me_stat.rss,
        me_stat.rss * page_size
    );
}

获取这些数据有几种方法,因此也可以查看代码仓库中更详细的self_memory示例。

Cargo功能

以下是一些可用的Cargo功能:

  • chrono -- 默认。可选。此功能启用了一些返回值为DateTime对象的函数。
  • flate2 -- 默认。可选。此功能启用通过procfs::kernel_config方法解析gzip压缩的/proc/config.gz文件。
  • backtrace -- 可选。此功能在抛出InternalError时提供堆栈跟踪。
  • serde1 -- 可选。此功能允许使用serde 1.0将大多数结构体序列化和反序列化。注意,此功能需要比1.48.0(procfs的MSRV)更新的rust版本。确切版本未在此处指定,因为serde没有MSRV策略。

最低Rust版本

此crate仅针对最新的稳定rustc编译器进行了测试,但可能与旧编译器兼容。有关详细信息,请参阅msrv.md

许可证

procfs库根据以下任一许可证授权:

根据您的选择。

有关文档的附加版权信息,请参阅COPYRIGHT.txt文件。

贡献

欢迎贡献,特别是在文档和旧内核测试方面。

除非您明确表示否则,您根据Apache-2.0许可证提交的任何有意包含在作品中的贡献,将如上所述双重授权,不附加任何额外条款或条件。

依赖关系

~1.2–7.5MB
~41K SLoC