procfs
这个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 以秒为单位
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!("内存页大小: {}", page_size);
println!("== /proc/self/stat 中的数据:");
println!("使用的总虚拟内存: {} 字节", me_stat.vsize);
println!(
"总驻留集: {} 页 ({} 字节)",
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更新的rust版本(这是procfs的MSRV)。这里没有指定确切的所需版本,因为serde没有MSRV策略。
最低Rust版本
这个crate仅针对最新的稳定版rustc编译器进行测试,但可能适用于较旧的编译器。详见msrv.md。
许可证
procfs库使用以下两种许可证之一:
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
关于文档的额外版权信息,请参见COPYRIGHT.txt文件。
贡献
欢迎贡献,特别是在文档和旧内核测试方面。
除非您明确声明,否则您有意提交以包含在作品中的任何贡献,按照Apache-2.0许可证的定义,均应按上述方式双重许可,不附加任何额外条款或条件。