2014-02-13 77 views
1

我想知道是否有一種方法來訪問當前進程中所有打開的目錄列表?我有一個遞歸地打開許多目錄的函數,但一旦出錯,就退出程序。當然,我希望在調用exit()之前關閉所有目​​錄,而不必跟蹤我打開的所有內容。這甚至有可能嗎?關閉退出打開的目錄()

謝謝!

+1

'退出()'將隱式關閉所有的文件描述符。你需要明確關閉它們嗎? –

+0

所以我不應該太在意valgrind關於這個漏洞的報道? – stzzz1

+0

考慮使用[nftw(3)](http://man7.org/linux/man-pages/man3/nftw.3.html) –

回答

1

我有一個函數可以遞歸地打開許多目錄,但一旦出錯就退出程序。 當然,我想在調用exit()之前關閉所有目​​錄,而不必跟蹤我打開的所有內容。

我覺得你的做法是錯誤的。如果你沒有對它們進行處理,打開目錄有什麼意義?

只要您需要,您應該保留對已打開目錄的引用,並儘快將其丟棄。

請記住,通常,打開的文件描述符的標準是有限的,例如, G。到1024.

0

您不需要這樣做,因爲exit()將(最終)退出該進程,該進程將關閉所有打開的文件描述符,無論是用於目錄還是實際文件。

但是,你絕對必要擔心valgrind和朋友報告這個,因爲這意味着fd s的程序中的泄漏。但解決方案不是爲了打開目錄尋找,而是爲了確保每個opendir都與closedir相匹配。這就是valgrind促使你做的事情。

0

當你exit(),文件句柄是close()d。這對於一次性工具很有用,但從長遠來看並不是一個好習慣。

您應該隨時走回去遞歸,close()ing。替換,例如:

exit(1); 

爲:

close(current_fd); 
return NULL; 

更改遞歸調用爲:

if (thisfunc(...) == NULL) { 
    close(current_fd); 
    return NULL; 
}