Rust 中 libc::stat 中的文件参数

File-argument in libc::stat in Rust

我很难用 Rust 调用 libc::stat。我有这个:

extern crate libc;
use std::fs::File;
use std::os::unix::prelude::*;
use std::path::Path;

fn main() {
    let p = Path::new("/");
    let f = File::open(&p).unwrap();
    let fd = f.as_raw_fd() as i8;

    unsafe {
        let mut stat: libc::stat = std::mem::zeroed();
        if libc::stat(fd, &mut stat) >= 0 {
            println!("{}", stat.st_blksize);
        }
    }
}

但现在我收到此错误:error: mismatched types: expected *const i8, found i8

我找不到关于第一个参数如何工作的任何文档。从类型来看(i8)我以为一定是文件描述符

背景:我正在通读 "Advanced Programming in the UNIX Environment" 并且想用 Rust 而不是 C 做一些练习。

stat is the file path as a C string. C strings are represented in Rust by CStr (borrowed) or CString 的第一个参数(拥有)。这是一个使用 CString:

的例子
extern crate libc;

use std::ffi::CString;

fn main() {
    unsafe {
        let root = CString::new("/").unwrap();
        let mut stat: libc::stat = std::mem::zeroed();
        if libc::stat(root.as_ptr(), &mut stat) >= 0 {
            println!("{}", stat.st_blksize);
        }
    }
}

查看 Rust Book 的 FFI chapter 了解其他信息。