【问题标题】:Why is the Filesystem not recognised?为什么无法识别文件系统?
【发布时间】:2016-06-03 11:36:27
【问题描述】:

我正在尝试打印当前 linux 分区的磁盘状态。使用以下 C 代码:

 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/statfs.h>
  struct statfs S;

  int main(int argc,char *argv[]){

    int i = statfs("/dev/sda3",&S);
    if (i!=0){
            printf("File path error!!\n");
            exit(0);
    }
    if(S.f_type == 0xEF53){
            printf("The file system is ext_fs");
    }
    if (S.f_type == 0x4d44)
            printf("The Partition is MS DOS super magic\n");
    else
            printf("Some other partition\n");
    printf("Optimum transfer Blocks: %ld\n",S.f_bsize);

    return 0;

**问题是if(S.f_type == 0xEF53) 行无法正常工作,即即使我通过/dev/sda4 分区(我的linux 分区ext4)条件返回false。

我搜索了很多,但无法解决问题。请在这里指导我......

编辑S.f_type的值为16914836

【问题讨论】:

  • 你得到什么输出?你在S.f_type 中得到了什么价值?
  • 16914836。这就是我打印 S.f_type 时得到的结果。
  • 你应该在你的问题中说清楚。

标签: c linux partition


【解决方案1】:

statfs() 系统调用返回有关已安装文件系统的信息。 path 是挂载文件系统中任何文件的路径名。

相反,您是在 设备 上使用它,因此您获得的不是关于它的信息,而是关于 /dev 所在的文件系统的信息(edit:您报告的幻数对应于TMPFS_MAGIC,因此您的/dev 是tmpfs 文件系统)。

您必须首先挂载/dev/sda3(如果尚未挂载)并在挂载点或其下方的任何文件上调用statfs,以通过此系统调用获取有关文件系统的信息。

【讨论】:

  • 先生,/dev/sda3 已经挂载。 $ mount /dev/sda3 mount: according to mtab, /dev/sda3 is already mounted on / mount failed
  • @Midhun:你读过系统调用描述吗?要获取有关某些文件系统的信息,您必须对其中包含的任何文件(即在挂载点下)调用statfs;相反,您是在设备上调用它。
【解决方案2】:

statfs() 返回有关包含由其路径参数指向的文件的文件系统的信息。来自 statfs(2) 手册:

函数 statfs() 返回有关已挂载文件系统的信息。 path 是挂载文件系统中任何文件的路径名。

当第一个参数是文件系统中的常规文件时,您希望查询代码按预期工作。

我还建议您使用 switch 语句并使用诸如 EXT4_SUPER_MAGIC 之类的常量而不是诸如 0xEF53 之类的硬编码值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2019-09-02
    • 2015-04-03
    • 2020-10-13
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多