2016-05-30 16 views
2

Rustにlibc::statを呼び出すのが苦労しています。私は最初の引数がどのように働くか上の任意のドキュメントを見つけることができませんでしたerror: mismatched types: expected *const i8, found i8Rustの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); 
     } 
    } 
} 

が、今、私はこのエラーが表示されます。私はこれを持っています。タイプ(i8)から判断すると、ファイル記述子でなければならないと思っていました。

背景:私は、「UNIX環境での高度なプログラミング」を読んとstatへの最初の引数はC文字列としてファイルパスである代わりにC.

答えて

4

の錆でいくつかの演習をしたいんです。 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を見てみましょう。

関連する問題