Ящик libc
является «просто» библиотекой обертки для взаимодействия между C и Rust, поэтому, чтобы узнать, как использовать функцию, нужно прочитать руководство по функции C, для этого есть много источников, здесь один для fdopen()
:
Функция fdopen()
связывает поток с существующим файловым дескриптором, fd
.Режим потока (одно из значений "r"
, "r+"
, "w"
, "w+"
, "a"
, "a+"
) должен быть совместим с режимом дескриптора файла.Индикатор положения файла в новом потоке устанавливается равным fd
, а индикаторы ошибок и конца файла очищаются.Режимы "w"
или "w+"
не вызывают усечение файла.Дескриптор файла не дублируется и будет закрыт, когда поток, созданный с помощью fdopen()
, будет закрыт.Результат применения fdopen()
к объекту общей памяти не определен.
Основное использование таково:
use libc::fdopen;
use std::ffi::CString;
fn main() {
let mode = CString::new("w").unwrap();
unsafe {
let _ = fdopen(3, mode.as_ptr());
}
}
Чтобы использовать его, вы можете использовать fwrite()
:
Функция fwrite()
записывает 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");
}
}