2016-05-30 12 views
2

Я изо всех сил пытаюсь позвонить libc::stat в Rust. У меня есть это:Файл-аргумент в libc :: stat in Rust

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 в UNIX среде» и хотите сделать некоторые упражнения в Rust вместо C.

ответ

4

Первый аргумент 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); 
     } 
    } 
} 

Посмотрите на FFI chapter в Раст книги для другой информации.