2013-03-21 63 views
5

我有一個文件描述符設置爲正值,並帶有open()函數的結果,所以此fd指示文件。當我刪除實際文件fd仍然是一個正整數。我想知道,如果我由於某種原因刪除文件,我怎麼知道這個文件描述符不再有效。總之,我怎麼知道fd文件是指示,仍然存在或不存在。我想在FreeBSD上用C語言來做這件事。如何檢查文件是否仍然存在使用文件描述符

+0

嘗試寫入或讀取文件。這應該會返回一個錯誤。 – RedX 2013-03-21 09:39:12

+2

@RedX這不是UNIX的工作原理。 – LtWorf 2013-03-21 10:18:21

+0

是的,我知道我必須閱讀或打開該文件,但有沒有辦法打開或閱讀文件只有FD?是否有一個io讀取或打開只有fd,沒有路徑或文件* – 2013-03-21 10:25:11

回答

4

Unix系統讓你刪除打開的文件(或者說,刪除文件系統中所有對文件的引用)。但文件描述符是仍然有效。任何讀寫調用都會成功,因爲它們的文件名仍然存在。

換句話說,在文件描述符關閉之前,您不能完全刪除文件。一旦關閉,文件將被自動刪除。

使用有效的文件描述符,可以檢查文件名是否仍然存在,例如,

printf("%d\n", buf.st_nlink); // 0 means no filenames 

哪裏buffstat初始化一個struct stat

+0

感謝您的建議,但這是我面臨的不同情況。我只需要檢查一下fd文件是否仍然存在。如果不是通過fd學習的方法是什麼? – 2013-03-21 10:27:24

+1

@HasanBozok - 您可以在有效的文件描述符上使用'fstat'來獲取硬鏈接的數量。如果它是0,則文件名已被刪除。 – teppic 2013-03-21 10:39:52

+0

@teppic,有沒有什麼方法['ioctl'](http://pubs.opengroup.org/onlinepubs/009696699/functions/ioctl.html)可以用來實際上導致文件被刪除?如果可能的話,那會是危險的嗎? – 2013-03-21 10:48:18

1

之前寫入文件,你可以檢查它是否仍然存在使用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觀察目錄中的更改並從內核獲取通知,並在您的文件被某個其他進程刪除時獲取事件並對其執行相關操作。

請記住,這些事件並不是實時的,因此您仍然可以在獲取事件之前使用該文件幾毫秒。

相關問題