69 releases

new 0.8.23 Jul 23, 2024
0.8.21 May 30, 2024
0.8.20 Mar 18, 2024
0.8.18 Sep 22, 2023
0.1.0 Jul 26, 2019

#103 in Operating systems

Download history 515/week @ 2024-04-05 695/week @ 2024-04-12 468/week @ 2024-04-19 257/week @ 2024-04-26 396/week @ 2024-05-03 385/week @ 2024-05-10 745/week @ 2024-05-17 357/week @ 2024-05-24 520/week @ 2024-05-31 504/week @ 2024-06-07 640/week @ 2024-06-14 603/week @ 2024-06-21 614/week @ 2024-06-28 642/week @ 2024-07-05 995/week @ 2024-07-12 827/week @ 2024-07-19

3,189 downloads per month
Used in 6 crates (3 directly)

Apache-2.0

5MB
71K SLoC

nc

Build status Latest version Documentation Minimum rustc version License

Access system calls directly without std or libc.

Features:

  • No glibc or musl required
  • Access syscalls directly, via assembly
  • No global errno variable, every function returns an errno instead
  • Support latest kernel APIs, like io-uring and pidfd, introduced in linux 5.0+

Usage

Add this to Cargo.toml:

[dependencies]
nc = "0.8"

Examples

Get file stat:

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

Get human-readable error string:

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

Fork process:

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

Kill self:

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

Or handle signals:

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

fn main() {
    let ret = unsafe { nc::signal(nc::SIGALRM, handle_alarm as nc::sighandler_t) };
    assert!(ret.is_ok());
    let remaining = unsafe {nc::alarm(1) };
    let ret = unsafe { nc::pause() };
    assert!(ret.is_err());
    assert_eq!(ret, Err(nc::EINTR));
    assert_eq!(remaining, 0);
}

Stable version

For stable version of rustc, please install a C compiler (gcc or clang) first. As llvm_asm! feature is unavailable in stable version.

Supported Operating Systems and Architectures

  • 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

License

This library is release in Apache License.

No runtime deps