關於umount2函式的MNT_DETACH引數的探究
阿新 • • 發佈:2018-12-31
在manpages中有這麼一段介紹:
MNT_DETACH (since Linux 2.4.11)
Perform a lazy unmount: make the mount point unavailable for new
accesses, and actually perform the unmount when the mount point
ceases to be busy.
其大意為如果函式執行帶有此引數,不會立即執行umount操作,而會等掛載點退出忙碌狀態時才會去解除安裝它。
不過此函式執行會阻止對該掛載點執行新的訪問。之前就在訪問此掛載點操作也不會強制其退出,而是會等待其自然退出。
現在我有這樣一個資料夾test,在test下有一個test_file檔案.然後我在/mnt下建立test_dir,緊接著我會把./test掛載到/mnt/test_dir下。此時我切到/mnt/test_dir下可以看到test_file檔案。之後我用open函式開啟/mnt/test_dir/test_file成功獲取檔案描述符,這樣我就可以保證掛載點/mnt/test_dir處於忙碌狀態。此時用umount /mnt/test_dir命令會報出忙碌的錯誤,是無法完成解除安裝的。而呼叫帶MNT_DETACH的umount2函式就會執行成功,但是根據它的描述,它不會立即執行umount操作。但是此時你去執行 umount /mnt/test_dir命令會提示此目錄不是掛載點的錯誤。
其描述說掛載點不允許新的訪問,但是實際的效果是此時掛載點已經不存在了,因為之前掛載過來的檔案系統已經
被解除安裝掉了,此時/mnt/test_dir已經算不上真正意義上的掛載點了,它只是一個單純的檔案目錄。所謂的不允許訪問掛載點根本就沒有任何意義了,因為掛載點根本就不存在了。而且此時掛載點消失的無影無蹤,用
umount /mnt/test_dir命令測試會報出不是掛載點的錯誤,我真的懷疑此時已經徹底將檔案系統解除安裝掉了,只是保留了對於原始檔目錄即./test目錄的連結指向罷了。因為我實在是無法去區分了。我覺得在errno.h中access錯誤碼和檔案
不存在錯誤還是不同的,此函式執行後,我去訪問/mnt/test_dir目錄報出access錯誤碼的話我還是比較能接受的,但是事實並非這樣。這個我就有點糾結了,最起碼的來說,這個引數功能描述是錯誤的,往深處來說這個函式的實現是
存在問題的,沒有嚴格按照其功能實現。
搞了半天的東西是這個結局我實在是有點不太能接受,這個引數功能描述也太具有迷惑性了啊。寫出來和大家分享,希望大家以後不要犯同樣地錯誤了。如果有對這方面熟悉或者是對這個系統呼叫函式的具體實現瞭解的朋友看到,請求對我進行指導,求指教!!!求進步!!!