3

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

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

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

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

工作正常。但是,如果我替换"vfat""auto"NULL没有安装任何内容。

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

4

3 回答 3

5

内核不能自动检测文件系统,所以你必须自己做。

busybox 实际所做的只是遍历所有相关的文件系统,从 /proc/filesystems 解析,然后调用 mount() 直到它成功(参见第1898行)

于 2012-07-09T15:43:17.913 回答
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;
    }
}

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

于 2013-09-02T16:46:12.110 回答
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 大容量存储设备,以获取节点路径,但这应该可以帮助您入门。

于 2012-07-09T18:12:42.417 回答