我有一些问题。
我尝试读取一些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'
谢谢。
答案 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的问题。