71 个版本

0.9.2 2024年8月19日
0.8.23 2024年7月23日
0.8.20 2024年3月18日
0.8.18 2023年9月22日
0.1.0 2019年7月26日

#89 in 操作系统

Download history 410/week @ 2024-05-02 325/week @ 2024-05-09 763/week @ 2024-05-16 316/week @ 2024-05-23 581/week @ 2024-05-30 436/week @ 2024-06-06 670/week @ 2024-06-13 595/week @ 2024-06-20 683/week @ 2024-06-27 600/week @ 2024-07-04 1008/week @ 2024-07-11 935/week @ 2024-07-18 727/week @ 2024-07-25 839/week @ 2024-08-01 726/week @ 2024-08-08 551/week @ 2024-08-15

2,973 每月下载量
用于 6 个crate(3个直接使用)

Apache-2.0

5.5MB
74K SLoC

nc

Build status Latest version Documentation Minimum rustc version License

无需 stdlibc 直接访问系统调用。

功能

  • 无需glibc或musl
  • 通过汇编直接访问syscalls
  • 没有全局errno变量,每个函数返回errno
  • 支持最新的内核API,如linux 5.0+中引入的io-uring和pidfd

使用方法

将此添加到 Cargo.toml

[dependencies]
nc = "0.9"

示例

获取文件状态

let mut statbuf = nc::stat_t::default();
match unsafe { nc::stat("/etc/passwd", &mut statbuf) } {
    Ok(_) => println!("s: {:?}", statbuf),
    Err(errno) => eprintln!("Failed to get file status, got errno: {}", errno),
}

获取可读的错误字符串

let errno = nc::EPERM;
println!("err: {:?}", nc::strerror(errno);

创建进程

let pid = unsafe { nc::fork() };
match pid {
    Ok(0) => {
        println!("child process");
        let args = ["ls", "-l", "-a"];
        let env = ["FOO=BAR"];
        match unsafe { nc::execve("/bin/ls", &args, &env) } {
            Ok(_) => {},
            Err(errno) => eprintln!("`ls` got err: {}", errno),
        }
    }
    Ok(pid) => println!("[parent] child pid: {pid} "),
    Err(errno) => eprintln!("errno: {}", errno),
}

杀死自身

let pid = unsafe { nc::getpid() };
let ret = unsafe { nc::kill(pid, nc::SIGTERM) };
// Never reach here.
println!("ret: {:?}", ret);

或处理信号

fn handle_alarm(signum: i32) {
    assert_eq!(signum, nc::SIGALRM);
}

fn main() {
    #[cfg(nc_has_sa_restorer)]
    let sa = nc::sigaction_t {
        sa_handler: handle_alarm as nc::sighandler_t,
        sa_flags: nc::SA_RESTORER | nc::SA_RESTART,
        sa_restorer: nc::restore::get_sa_restorer(),
        ..nc::sigaction_t::default()
    };
    #[cfg(not(nc_has_sa_restorer))]
    let sa = nc::sigaction_t {
        sa_handler: handle_alarm as nc::sighandler_t,
        sa_flags: nc::SA_RESTART,
        ..nc::sigaction_t::default()
    };
    let ret = unsafe { nc::rt_sigaction(nc::SIGALRM, Some(&sa), None) };
    assert!(ret.is_ok());
    let remaining = unsafe { nc::alarm(1) };
    let mask = nc::sigset_t::default();
    let ret = unsafe { nc::rt_sigsuspend(&mask) };
    assert!(ret.is_err());
    assert_eq!(ret, Err(nc::EINTR));
    assert_eq!(remaining, Ok(0));
}

支持的操作系统和架构

  • linux
    • aarch64
    • arm
    • loongarch64
    • mips
    • mips64
    • mips64el
    • mipsel
    • powerpc64
    • powerpc64el
    • riscv64
    • s390x
    • x86
    • x86-64
  • android
    • aarch64
  • freebsd
    • x86-64
  • netbsd
    • x86-64
  • mac os
    • x86-64

许可

此库受Apache-2.0 许可证管辖。

无运行时依赖