根据挂载时自动检测文件系统。

3

我的应用程序可以挂载并检查插入USB插槽的任何U盘的内容。 问题是,一些用户可能使用格式化为标准“vfat”以外的其他文件系统的U盘。 标准

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

我需要的只是一个能够正常工作并且可以使用内核可读取的任何文件系统。问题是,我必须在应用程序内部完成它,我宁愿避免调用system()和shell命令,而寻求“自然”C语言解决方案。

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

如果我用"vfat"替换掉"auto"或者NULL,什么都没有挂载。

检查busybox的mount源码后,我发现在mount()调用中,如果提供了'auto'或没有提供文件系统类型,则将文件系统设置为NULL。但是这个技巧似乎对我不起作用。我错过了什么?有没有相对简单的方法来解决这个问题?


1
当您将“auto”选项作为文件系统类型指定时,mount实用程序在内部尝试检测文件系统。 - Anya Shenanigans
3个回答

5

内核无法自动检测文件系统,因此您需要自己进行检测。

busybox实际上所做的就是循环遍历从/proc/filesystems解析出的所有相关文件系统,并调用mount()直到成功为止(参见第1898行:http://git.busybox.net/busybox/tree/util-linux/mount.c)。


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;
    }
}

我知道这是一个老问题,但对于其他正在寻找答案的人来说,这似乎很相关。


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大容量存储设备的节点路径,但这应该可以让您开始。


1
提出问题的人明确表示他希望不需要使用system()或打开一个shell... - Piranna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接