在Linux上的C + +装载NTFS设备?

我试图在我的C ++应用程序中安装一个外部驱动器。 我最初尝试使用mount(2),但是失败了:

int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL); 

errno是19, ENODEV (内核中没有configuration文件系统types)

但是,如果我切换到使用mount(8),它工作正常:

 std::string cmd = "mount -t " + fsType + " " + deviceName + " " + mountPoint; int ret = system(cmd.c_str()); 

mount(2)是否有可接受的文件系统types的不同列表? 这是一个ntfs设备,所以我使用ntfs-3g作为fstype。 我检查/ proc / filesystems,看到这是没有列出,所以我尝试fuseblk但只是改变了22, EINVAL的错误。

使用mount(2)挂载NTFS设备的正确方法是什么?

mount.2只是一个内核调用。 mount.8是一个完整的外部工具,它延伸到内核之外。

我想你可能正在寻找一个libmount ,它是一个实现了mount.8完成的魔法的mount.8 。 较新的安装版本也使用它。 它在util-linux中提供 。

你有没有尝试使用strace命令运行mount(8) ? 它将打印出由程序进行的系统调用,包括mount(2) 。 当我进行这样的挂载时,会产生mount.ntfs (即NTFS-3g),然后为fuseblk做一个mount ,然后在后台旋转以支持挂载点。

基于FUSE的文件系统的处理方式不同,因为用户空间守护进程必须启动。 使用fuseblk并不能为内核启动守护进程提供足够的信息(并且内核甚至没有启动守护进程的信息)。 对于NTFS -3g,通常会做ntfs-3g /dev/sda1 /mnt/windows (从帮助)。 没有一个编程的方式来告诉内核这样做,因为它发生在用户空间。