我的应用程序应该安装并检查插入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日志以获取节点路径,但是这应该让您开始。