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

时间:2016-07-13 20:18:39

标签: rust libc

我试图访问FILE libc结构的不同字段。

根据{{​​1}}:

中的内存映射,在Rust中实现

FILE

stdio.h

在libc中使用#[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, ... } 时,它们来自FILE变体,这在某种程度上是访问字段的方式。以下代码触发mut * _ flags error: attempted access of field

on type '*mut FILE', but no field with that name was found

let stdout = libc::fdopen(libc::STDOUT_FILENO, &('w' as libc::c_char)); let is_unbuffered = (fp._flags & libc::_IONBF as i16) != 0 类型的变量没有FILE变体,但我需要使用mut *

2 个答案:

答案 0 :(得分:3)

FILE被定义为opaque type,即:

pub enum FILE {}

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

我认为直接访问FILE结构的字段并不是一个好主意,即使在C中也是如此。您应该尝试在stdio.h上找到一个能够达到您想要的功能。

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

#[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的正确定义,您将获得一些垃圾数据甚至是段错误。

答案 1 :(得分:0)

指针本身没有属性,它指向的结构。

这意味着您需要访问*fp._flags,而不是fp._flags(假设fp的类型为*mut FILE)。

此外,您可能需要将访问权限包装在unsafe块中,因为取消引用原始指针始终是不安全的操作。尝试这样的事情:

let flags = unsafe { (*fp)._flags };
let is_unbuffered = (flags & libc::_IONBF as i16) != 0;