2016-05-30 22 views
2

Ich habe Probleme, libc::stat in Rust zu rufen. Ich habe dies:Datei-Argument in 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); 
     } 
    } 
} 

aber jetzt erhalte ich diesen Fehler: error: mismatched types: expected *const i8, found i8

ich keine Unterlagen darüber, wie das erste Argument Werke finden konnten. Nach dem Typ zu urteilen (i8) dachte ich, es muss Dateideskriptor sein.

Hintergrund: ich durch „Advanced Programming in der UNIX-Umgebung“ ich zu lesen und wollen

Antwort

4

Das erste Argument für stat ist der Dateipfad als C-String einige Übungen in Rust statt C. zu tun. C-Saiten sind in Rust von CStr (geliehen) oder CString (im Besitz) vertreten. Hier ist ein Beispiel unter Verwendung von 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); 
     } 
    } 
} 

Werfen Sie einen Blick auf die FFI chapter des Rust-Buch für weitere Informationen.