我的应用程序应该安装并检查插入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。但这个技巧对我来说似乎不起作用。我错过了什么?是否有一些相对简单的方法来做到这一点?
答案 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大容量存储设备以获取节点路径,但这应该可以帮助您入门。