温馨提示×

rust如何调linux api

小樊
38
2026-10-21 16:59:18
栏目: 编程语言

在 Rust 里调用 Linux 系统 API(也就是 Linux 的 syscall / libc 函数),常见有几种方式,从底层到高层依次是:


一、直接用 libc(最常用、最贴近 C)

Linux 的 API 大多在 libc 里,Rust 通过 libc crate 调用。

1. 添加依赖

[dependencies]
libc = "0.2"

2. 示例:调用 getpid()

use libc::getpid;

fn main() {
    let pid = unsafe { getpid() };
    println!("PID = {}", pid);
}

⚠️ 所有 libc 调用都是 unsafe 的


二、直接 syscall(更底层)

如果你想绕过 libc,直接进内核(比如写玩具 OS、安全研究):

示例:使用 libc::syscall

use libc::{syscall, SYS_getpid};

fn main() {
    let pid = unsafe { syscall(SYS_getpid) };
    println!("PID = {}", pid);
}

或者更原始(x86_64):

unsafe fn syscall0(n: u64) -> u64 {
    let ret: u64;
    core::arch::asm!(
        "syscall",
        in("rax") n,
        lateout("rax") ret,
        options(nomemory, nostack)
    );
    ret
}

三、使用 nix crate(推荐日常开发)

nix 是对 libc 的安全封装,少写 unsafe。

[dependencies]
nix = "0.27"
use nix::unistd::getpid;

fn main() {
    println!("PID = {}", getpid());
}

四、调用 ioctl / 文件 API(设备、网络)

示例:open + read

use std::fs::File;
use std::os::unix::io::AsRawFd;
use nix::fcntl::{open, OFlag};
use nix::sys::stat::Mode;

fn main() {
    let fd = open("/etc/hostname", OFlag::O_RDONLY, Mode::empty()).unwrap();
    println!("fd = {}", fd);
}

五、常见 Linux API 对应 Rust 方案

Linux API Rust 方式
fork / exec nix::unistd
socket nix::sys::socket
epoll mio / epoll crate
mmap nix::sys::mman
ptrace nix::sys::ptrace
ioctl nix / ioctl macro

六、完整最小示例(libc)

use libc::{c_char, getcwd};

fn main() {
    let mut buf = [0 as c_char; 256];
    unsafe {
        getcwd(buf.as_mut_ptr(), buf.len());
    }
    let cwd = std::ffi::CStr::from_ptr(buf.as_ptr());
    println!("cwd = {:?}", cwd);
}

七、建议

  • ✅ 普通程序:nix
  • ✅ 系统编程 / 安全:libc
  • ✅ 极端底层:syscall / asm
  • ❌ 不要自己乱封装 raw syscall(易崩)

如果你有具体想调用的 Linux API(比如 epoll、fork、io_uring、ptrace),我可以给你完整示例。

0 踩