#binding #ffi #sys #low-level #sigar

sys sigar-sys

sigar 的底层绑定

3 个稳定版本

使用旧的 Rust 2015

1.0.3 2018年11月3日
1.0.1 2018年11月1日
1.0.0 2018年10月31日

#26 in #sys


用于 sigar-rs

MIT 许可证

1MB
28K SLoC

C 21K SLoC // 0.1% comments Rust 7K SLoC C++ 181 SLoC // 0.1% comments

sigar-sys

Crates.io

Docs

底层绑定到 AlexYaruki/sigar,这是官方 hyperic/sigar 的一个独立分支版本。

用法

将此内容添加到您的 Cargo.toml

[dependencies]
sigar-sys = "1"

并将此内容添加到您的 crate 根目录

extern crate sigar_sys;

注意

  • 作为一个 -sys crate,此 crate 仅提供 sigar 的绑定。

    sigar 的文档本身在 SourceForge/sigar

  • 此 crate 的构建脚本始终执行静态链接。

  • 此 crate 已在 Windows(msvc)、Linux 和 macOS 上进行测试。

    其他平台或环境可能也能运行,欢迎提交支持它们的 PR。

示例

extern crate sigar_sys;

use sigar_sys as ffi;
use std::slice::from_raw_parts;

fn main() {
    let usage = unsafe { cpuusage().unwrap() };
    println!("cpu usage: {:?}", usage);

    let pids = unsafe { pidlist().unwrap() };
    println!("pids: {:?}", pids);
}

unsafe fn cpuusage() -> Result<ffi::sigar_cpu_t, String> {
    let mut sigar_ptr: *mut ffi::sigar_t = std::ptr::null_mut();

    let res = ffi::sigar_open(&mut sigar_ptr);
    if res != ffi::SIGAR_CODE_OK {
        return Err(ffi::error_string(sigar_ptr, res));
    }

    let mut info: ffi::sigar_cpu_t = Default::default();
    let res = ffi::sigar_cpu_get(sigar_ptr, &mut info);
    if res != ffi::SIGAR_CODE_OK {
        return Err(ffi::error_string(sigar_ptr, res));
    }

    let res = ffi::sigar_close(sigar_ptr);
    if res != ffi::SIGAR_CODE_OK {
        return Err("failed to close sigar_t".to_string());
    }

    Ok(info)
}

unsafe fn pidlist() -> Result<Vec<ffi::sigar_pid_t>, String> {
    let mut sigar_ptr: *mut ffi::sigar_t = std::ptr::null_mut();

    let res = ffi::sigar_open(&mut sigar_ptr);
    if res != ffi::SIGAR_CODE_OK {
        return Err(ffi::error_string(sigar_ptr, res));
    }

    let mut raw: ffi::sigar_proc_list_t = Default::default();
    let res = ffi::sigar_proc_list_get(sigar_ptr, &mut raw);
    if res != ffi::SIGAR_CODE_OK {
        return Err(ffi::error_string(sigar_ptr, res));
    }

    let infos = from_raw_parts(raw.data, raw.number as usize)
        .to_vec()
        .clone();

    let res = ffi::sigar_proc_list_destroy(sigar_ptr, &mut raw);
    if res != ffi::SIGAR_CODE_OK {
        return Err("failed to destroy sigar_t".to_string());
    }

    let res = ffi::sigar_close(sigar_ptr);
    if res != ffi::SIGAR_CODE_OK {
        return Err("failed to close sigar_t".to_string());
    }

    Ok(infos)
}

要在 Windows 上运行示例代码,我们应链接 3 个额外的库:ws2_32 netapi32version,可能在构建脚本中

依赖关系