【问题标题】:File-argument in libc::stat in RustRust 中的 libc::stat 中的文件参数
【发布时间】:2016-05-30 19:32:53
【问题描述】:

我很难在 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)来看,我认为一定是文件描述符。

背景:我正在阅读“UNIX 环境中的高级编程”,并想用 Rust 而不是 C 来做一些练习。

【问题讨论】:

    标签: rust libc


    【解决方案1】:

    stat 的第一个参数是 C 字符串形式的文件路径。 C 字符串在 Rust 中由CStr(借用)或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 了解其他信息。

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 2022-09-29
      • 2023-03-31
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多