该 libc crate是“只是”C和Rust之间接口的包装库所以要知道如何使用函数,应该阅读C函数的手册,有很多来源,这里有一个用于 fdopen() :
libc
fdopen()
该 fdopen() 函数将流与现有文件描述符相关联, fd 。流的模式(其中一个值 "r" , "r+" , "w" , "w+" , "a" , "a+" )必须与文件描述符的模式兼容。新流的文件位置指示符设置为属于该文件的文件位置指示符 fd ,并清除错误和文件结束指示符。模式 "w" 要么 "w+" 不要导致截断文件。文件描述符不是重复的,并且在创建流时将关闭 fdopen() 关闭了。申请结果 fdopen() 到共享内存对象是未定义的。
fd
"r"
"r+"
"w"
"w+"
"a"
"a+"
基本用途是这样的:
use libc::fdopen; use std::ffi::CString; fn main() { let mode = CString::new("w").unwrap(); unsafe { let _ = fdopen(3, mode.as_ptr()); } }
要使用它,你可以使用 fwrite() :
fwrite()
功能 fwrite() 写 nmemb 数据元素,每个字节长,到流指向的流,从给定的位置获取它们 ptr 。
nmemb
ptr
那么,完整的例子:
use libc::{c_void, fdopen, fwrite}; use std::ffi::CString; fn main() { let mode = CString::new("w").unwrap(); let file = unsafe { let file = fdopen(3, mode.as_ptr()); if file.is_null() { panic!("can't open file"); } file }; let welcome = "Hello world!"; let result = unsafe { fwrite(welcome.as_ptr() as *const c_void, 1, welcome.len(), file) }; if result != welcome.len() { panic!("write not successful"); } }