为什么文件系统无法识别?

时间:2016-02-22 06:17:21

标签: c linux partition

我正在尝试打印当前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

2 个答案:

答案 0 :(得分:3)

  

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

相反,您正在设备上使用它,因此您无法获取有关它的信息,而是关于/dev所在的文件系统( edit :您报告的幻数对应TMPFS_MAGIC,因此您的/devtmpfs文件系统。

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

答案 1 :(得分:1)

statfs()返回有关包含其path参数指向的文件的文件系统的信息。从statfs(2)手册:

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

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

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