我有一個文件描述符設置爲正值,並帶有open()函數的結果,所以此fd指示文件。當我刪除實際文件fd仍然是一個正整數。我想知道,如果我由於某種原因刪除文件,我怎麼知道這個文件描述符不再有效。總之,我怎麼知道fd文件是指示,仍然存在或不存在。我想在FreeBSD上用C語言來做這件事。如何檢查文件是否仍然存在使用文件描述符
回答
Unix系統讓你刪除打開的文件(或者說,刪除文件系統中所有對文件的引用)。但文件描述符是仍然有效。任何讀寫調用都會成功,因爲它們的文件名仍然存在。
換句話說,在文件描述符關閉之前,您不能完全刪除文件。一旦關閉,文件將被自動刪除。
使用有效的文件描述符,可以檢查文件名是否仍然存在,例如,
printf("%d\n", buf.st_nlink); // 0 means no filenames
哪裏buf
是fstat
初始化一個struct stat
。
感謝您的建議,但這是我面臨的不同情況。我只需要檢查一下fd文件是否仍然存在。如果不是通過fd學習的方法是什麼? – 2013-03-21 10:27:24
@HasanBozok - 您可以在有效的文件描述符上使用'fstat'來獲取硬鏈接的數量。如果它是0,則文件名已被刪除。 – teppic 2013-03-21 10:39:52
@teppic,有沒有什麼方法['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)可以用來實際上導致文件被刪除?如果可能的話,那會是危險的嗎? – 2013-03-21 10:48:18
之前寫入文件,你可以檢查它是否仍然存在使用access()
if (access("/yourfile",W_OK)!=-1) {
//Write on the file
}
你也可以做FSTAT的描述:
struct stat statbuf;
fstat(fd,&statbuf);
if (statbuf.st_nlink > 0) {
//File still exists
}
但它會減慢你的軟件下來很多,還有一些程序可能會將文件鏈接到其他地方,並取消鏈接原始名稱,以便該文件仍然存在,但位於不同的名稱/位置,並且此方法無法檢測到該文件。
一個更好的選擇是在GNU/Linux上使用inotify
,或者在bsd上使用kqueue,但我從來沒有使用過第二種。
您可以使用這些API觀察目錄中的更改並從內核獲取通知,並在您的文件被某個其他進程刪除時獲取事件並對其執行相關操作。
請記住,這些事件並不是實時的,因此您仍然可以在獲取事件之前使用該文件幾毫秒。
- 1. 如何檢查存儲在變量中的給定文件描述符是否仍然有效?
- 2. 是否EXEC保存文件描述符
- 3. 如何檢查文件句柄是否仍然指向文件
- 4. 檢查套接字文件描述符是否可用?
- 5. Linux系統:檢查是否文件描述符可以讀取
- 6. 檢查文件描述符是否有效
- 7. Linux內核 - 檢查是否有文件描述符
- 8. 如何檢查Expressionengine 2中的文件描述是否爲空?
- 9. 如何確定文件描述符是否可查找?
- 10. fopen是否創建文件描述符?
- 11. 如何檢查文件描述符是否有可用的數據?
- 12. Bash:如何檢查一個文件是否仍在使用
- 13. 如何檢查文件是否仍然使用Windows API在cpp中複製?
- 14. 如何檢查文件是否存在
- 15. 如何檢查文件是否存在?
- 16. 如何檢查文件是否存在?
- 17. 如何檢查文件是否存在?
- 18. 如何檢查文件是否存在
- 19. 如何使一個文件描述符
- 20. 如何檢查一個ALAsset是否仍然存在使用URL
- 21. 文件描述符飢餓和阻斷文件描述符
- 22. 如何檢查子文件夾文本文件是否存在
- 23. 確定文件結構(描述文件描述符)是否爲'特殊文件'(即塊/字符設備)
- 24. 如果使用EIO關閉(2)失敗,文件描述符是否仍然會被刪除?
- 25. 檢查會話是否仍然存在
- 26. 檢查歌曲是否仍然存在
- 27. 如何在Python中使用管道文件描述符時檢查EOF?
- 28. Linux:使用文件描述符查找閃存流
- 29. 檢查IniFile描述符是否打開
- 30. 檢索文件描述符:: fstream的
嘗試寫入或讀取文件。這應該會返回一個錯誤。 – RedX 2013-03-21 09:39:12
@RedX這不是UNIX的工作原理。 – LtWorf 2013-03-21 10:18:21
是的,我知道我必須閱讀或打開該文件,但有沒有辦法打開或閱讀文件只有FD?是否有一個io讀取或打開只有fd,沒有路徑或文件* – 2013-03-21 10:25:11