[英]Mount NTFS device in C++ on linux?
我試圖在我的C ++應用程序中安裝外部驅動器。 我最初嘗試使用mount(2),但是失敗了:
int ret = mount(deviceName.c_str(), mountPoint.c_str(), fsType.c_str(), 0, NULL);
errno是19, ENODEV
(內核中未配置文件系統類型)
但是,如果我切換到使用mount(8),它將運行良好:
std::string cmd = "mount -t " + fsType + " " + deviceName + " " + mountPoint;
int ret = system(cmd.c_str());
mount(2)是否有其他可接受文件系統類型的列表? 這是一個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
(通過幫助)。 沒有一種編程方式可以告訴內核執行此操作,因為它發生在用戶空間中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.