【问题标题】:How to read VFS attributes in Linux如何在 Linux 中读取 VFS 属性
【发布时间】:2014-06-01 11:54:03
【问题描述】:

我有一些问题。

我尝试读取一些 VFS 属性,例如 struct super_block 中的 s_magic 值。 但我看不懂 s_magic。

这是我的代码。

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<linux/fs.h>
int main()
{
    int fd;
    char boot[1024];
    struct super_block sb;
    fd = open("/dev/fd", O_RDONLY);
    read(fd, boot, 1024);
    read(fd, &sb, sizeof(struct super_block);
    printf("%x\n", sb.s_magic);
    close(fd);

    return 0;
 }

所以,此代码因某些错误而无法工作。 在此错误中,“sb”的存储大小未知,并且“sizeof”对不完整类型“struct super_block”的应用无效

谢谢。

【问题讨论】:

    标签: linux linux-kernel vfs


    【解决方案1】:

    那是因为您的 linux/fs.h 不包含 super_block 声明。那是因为你想包含来自 Linux kernellinux/fs.h,但实际上包含来自 Linux userspacelinux/fs.h。像这样向 gcc 提供-I &lt;include path&gt; 选项

    gcc -I /usr/src/kernels/$(uname -r)/include
    

    但是!

    你会得到一百万个错误,因为你不能只在你的用户空间程序中包含内核头文件——你没有所有的类型和结构定义。

    内核头文件没有考虑到用户空间,它们 可以随时更改。用户空间应用程序的正确方法 与内核的接口是通过 C 库的方式,它提供 它自己的结构,并在必要时将它们翻译成任何 当前内核期望。这种分离有助于保持用户空间 内核更改时程序不会中断。

    (来源http://lwn.net/Articles/113349/

    所以你必须修改你的代码。

    附:我已经向您解释了为什么您的代码无法正常工作,但我不知道您如何在用户空间中读取 super_block。你最好再问一个关于文件系统超级块 API 的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2018-12-18
      • 2013-09-01
      • 2015-03-12
      • 1970-01-01
      相关资源
      最近更新 更多