gpt4 book ai didi

rust - 如何访问 *mut libc::FILE 的字段?

转载 作者:行者123 更新时间:2023-11-29 08:06:24 25 4
gpt4 key购买 nike

我正在尝试访问 libcFILE 结构的不同字段。

FILE 根据 stdio.h 中的内存映射在 Rust 中实现:

#[repr(C)]
pub struct FILE {
pub _p: libc::c_char,
pub _r: libc::c_int,
pub _w: libc::c_int,
pub _flags: libc::c_short,
pub _file: libc::c_short,
...
}

在 libc 中使用 FILE 时,它们会出现在 mut * 变体中,这在某种程度上阻碍了访问字段。以下代码触发错误:尝试访问字段_flagson type '*mut FILE',但未找到具有该名称的字段

let stdout = libc::fdopen(libc::STDOUT_FILENO, &('w' as libc::c_char));
let is_unbuffered = (fp._flags & libc::_IONBF as i16) != 0

没有 mut * 变体的 FILE 类型的变量可以工作,但我需要让它与 mut * 一起工作。

最佳答案

FILE被定义为 opaque type ,即:

pub enum FILE {}

因此没有可访问的字段(甚至取消引用原始指针)。


我认为直接访问FILE 结构的字段不是一个好主意,即使在C 中也是如此。您应该尝试在stdio.h 上找到一个函数。做你想做的事。


无论如何,一种解决方法是创建您自己的 FILE 定义并从 fp 获取 &mut:

#[repr(C)]
pub struct MY_FILE {
pub _p: libc::c_char,
pub _r: libc::c_int,
pub _w: libc::c_int,
pub _flags: libc::c_short,
pub _file: libc::c_short,
// ...
}

// ...

unsafe {
let fp = libc::fdopen(libc::STDOUT_FILENO, &('w' as libc::c_char));
let fp = &mut *(fp as *mut MY_FILE);
let is_unbuffered = (fp._flags & libc::_IONBF as i16) != 0;
}

请注意,如果您没有为 MY_FILE 使用正确的定义,您将获得一些垃圾数据甚至段错误。

关于rust - 如何访问 *mut libc::FILE 的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com