如何在Linux中读取VFS属性

时间:2014-06-01 11:54:04

标签: linux linux-kernel vfs

我有一些问题。

我尝试读取一些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'

谢谢。

1 个答案:

答案 0 :(得分:1)

那是因为您的linux/fs.h不包含super_block声明。那是因为您希望包含来自Linux 内核linux/fs.h,但实际上包含来自Linux 用户空间linux/fs.h。像这样提供gcc的-I <include path>选项

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

<强> BUT!

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

  

内核头文件并未考虑用户空间,而是它们   可以随时改变。用户空间应用程序的正确方法   与内核的接口是通过C库提供的   它自己的结构,并在必要时将它们翻译成任何东西   当前的内核期望。这种分离有助于保持用户空间   程序在内核发生变化时破坏。

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

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

P.S。我已经给你并解释了为什么你的代码不能正常工作,但我不知道如何在用户空间中读取super_block。您最好提出另一个有关文件系统超级块API的问题。