Rust で libc の関数を呼ぶ時のメモ(Rust 0.8)

はじめに

公式のドキュメント読んだほうがいいよ!(デデドン)
http://static.rust-lang.org/doc/0.8/tutorial-ffi.html

コード例

use std::libc::*;

fn rust_system(command: ~str){
    #[fixed_stack_segment];
    command.with_c_str(|c_buffer| {
            unsafe { system(c_buffer); }
    })
}
fn main(){
    rust_system(std::os::args()[1]);
}

libc を use して unsafe ブロック内で読んでるだけです。今回は試しに system 関数に投げてみました。
一応動いてはいるけれど、 std::c_str - Rust を読んでいると、

use std::libc;
extern{
    fn system(command: *libc::c_char)
}

と宣言して使ったほうが良いのかもしれません。英語が読めなくて手探りで触ってるので相当いい加減なこと言ってるかも…!(言い訳)
libc で使える関数は std::libc - Rust で参照してください。

エラー例

fixed_stack_segment がない例

notification.rs:5:21: 5:27 error: invoking non-Rust fn in fn without #[fixed_stack_segment] [-D cstack (default)]
notification.rs:5             unsafe { system(c_buffer); } 
                                       ^~~~~~
error: aborting due to previous error
libc++abi.dylib: terminating with uncaught exception of type unsigned long

エラー分の通り。unsafe ブロック前とか関数そのものに #[fixed_stack_segment] 属性をつけてあげると良いです。