mount()上的自动检测文件系统

时间:2012-07-09 15:05:20

标签: c linux filesystems mount

我的应用程序应该安装并检查插入USB插槽的任何pendrive的内容。 问题是,一些用户可能正在使用格式化为其他文件系统的pendrives,而不是标准的'vfat'。 标准

 mount /dev/sda1 /mnt/pendrive -t auto

足以满足我的需求 - 它可以工作,并且将使用内核可读的任何文件系统。 问题是我必须在应用程序中执行此操作,并且当“自然”C解决方案存在时,我宁愿避免调用system()和shell命令。

 #include <sys/mount.h>
 ...
 result = mount("/dev/sda1", "/mnt/pendrive", "vfat" ,0, NULL);

正常工作。但是,如果我将"vfat"替换为"auto"NULL,则不会安装任何内容。

当我检查busybox的mount的源代码时,如果提供了'auto'或没有提供文件系统类型,它似乎在mount()调用中将文件系统设置为NULL。但这个技巧对我来说似乎不起作用。我错过了什么?是否有一些相对简单的方法来做到这一点?

3 个答案:

答案 0 :(得分:5)

内核无法自动检测文件系统,因此您必须自己执行此操作。

busybox实际上只是循环遍历所有相关文件系统,从/ proc / filesystems解析,并调用mount()直到成功(参见第{3}行)

答案 1 :(得分:3)

为什么不使用循环?

#define MAX 4
const char *FSTypes[MAX] = { "ext4", "btrfs", "ntfs", "vfat" };
short Inc = 0;

for (; Inc < MAX; ++Inc)
{
    if (mount("/source", "/target", FSTypes[Inc], 0, NULL) == 0)
    { /*If it's successful, stop.*/
        break;
    }
}

我意识到这是一个古老的问题,但这似乎与寻找答案的其他人有关。

答案 2 :(得分:1)

如果您需要mount /dev/sda1 /mnt/pendrive -t auto。然后就这样做。

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
rc = system(cmd);

sprintf(cmd, "mount /dev/sda1 /mnt/pendrive -t auto")    
if ((p = popen(cmd, "w")) != NULL)
{
    ...
}

应该可以正常工作。您可能需要侦听udev事件或扫描udev日志以获取当前连接的USB大容量存储设备以获取节点路径,但这应该可以帮助您入门。