我想創(chuàng)建一個 FUSE 文件系統(tǒng),它接受對文件系統(tǒng)內(nèi)任何路徑的任何類型的寫入操作。有點像命名管道,但采用目錄的形式。echo test > bar # consumes "test"echo test > bar/foo # consumes "test", even though the directory "bar" hasn't been createdecho test > x/y/z/test # consumes "test", even though the directories "x/y/z" haven't been created我使用bazil.org/fuse進行實施。我面臨的問題是,當應用程序想要寫入foo/bar我的文件系統(tǒng)內(nèi)部時,它會檢查是否foo是目錄,然后檢查是否bar是文件。不幸的是,我無法預先知道foo應該是文件還是目錄。我的Attr函數(shù)如下所示:func (d *Dir) Attr(ctx context.Context, a *fuse.Attr) error { a.Inode = 1 a.Mode = os.ModeDir | 0755}此代碼特定于目錄節(jié)點類型,因為os.ModeDir. 我希望這適用于目錄或文件。有辦法實現(xiàn)我想要的嗎?去保險絲
1 回答

收到一只叮咚
TA貢獻1821條經(jīng)驗 獲得超5個贊
我面臨的問題是,當應用程序想要寫入
foo/bar
我的文件系統(tǒng)內(nèi)部時,它會檢查是否foo
是目錄,然后檢查是否bar
是文件。不幸的是,我無法預先知道foo
應該是文件還是目錄。
考慮到這些限制,解決您的問題是不可能的。
文件系統(tǒng)節(jié)點可以是文件,也可以是目錄;有時兩者都不是,但絕不會同時兩者。因為您的 FUSE 驅(qū)動程序無法提前知道執(zhí)行請求的應用程序是否getattr
意味著在節(jié)點內(nèi)遞歸,直到它實際嘗試這樣做,所以您無法知道它是否應該偽裝成文件或目錄。
您最好的選擇似乎是:
將特定于應用程序的虛擬目錄結(jié)構(gòu)硬編碼到您的 FUSE 驅(qū)動程序中
在 FUSE 驅(qū)動程序中實施特定于應用程序的啟發(fā)式方法
讓您的 FUSE 驅(qū)動程序記住
getattr
請求并通過反復試驗構(gòu)建虛擬目錄樹(并不斷重新運行應用程序直到它起作用)
- 1 回答
- 0 關(guān)注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消