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

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

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

足以满足我的需求 – 它可以工作,内核可读的任何文件系统都将被使用。 问题是我必须从应用程序内部做到这一点,而我宁愿避免在“自然”C解决scheme存在时调用system()和shell命令。

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

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

当我检查busybox挂载的源文件时,如果提供了'auto'或没有提供文件系统types,似乎在mount()调用中将文件系统设置为NULL。 但是这个伎俩似乎不适合我。 我错过了什么? 有没有一些相对简单的方法来做到这一点?

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

busybox实际上只是循环遍历所有相关的文件系统,从/ proc / filesystems中解析出来,然后调用mount()直到成功(见1898行)

为什么不使用循环?

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

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

如果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事件,或扫描当前连接的USB海量存储设备的udev日志以获取节点路径,但是这应该让您开始。