2012-10-27 68 views
5

我想實施的行爲在我的C程序,這樣,如果一個SIGINT發生,我關閉所有打開的文件描述符。有一個簡單的方法來獲得它們的列表嗎?Ç得到所有打開的文件描述符

+2

搜索信號處理程序。 –

+1

你爲什麼要這樣的事情? – qdot

+1

當你從main退出();或返回時,內核應該爲你關閉這些文件描述符。 – yeyo

回答

5

我會用蠻力:for (i = 0; i < fd_max; ++i) close (i);。快速和漂亮的便攜式。

+0

明顯容易得多,是的!)但是比賽可能仍然是一個問題。 – alk

+3

您可能想使用'getrlimit(RLMIIT_NOFILE,&rlim)'查找最大'fd_max'。 –

+0

您確定要關閉「stdin」的文件描述符嗎? 'stdout'和'stderr'(0,1,2)? – alk

3

所有打開的文件描述符的跟蹤和單獨關閉它們。

在一般情況下,你使用可能有一個打開的文件,並在關閉該庫將導致庫胡作非爲。

實際上,您自己的代碼中可能存在同樣的問題,因爲如果您不加區分地關閉文件描述符,但程序的另一部分仍然記住文件描述符並嘗試使用它,則會出現意外錯誤或(if其他文件已打開)對錯誤文件進行操作。負責打開文件的組件也負責關閉文件。

2

如果有的話你可以讀出/proc/<pid>/fd.內容。

但是請注意,如果您的應用程序關閉了某些內容,或者在您讀出的/proc/<pid>/fd之間打開新的內容,並且您要關閉所閱讀的內容,則可能會發生這種情況。

所以conculding我想推薦凱文·裏德的方法來此。

+0

爲什麼你認爲'/ proc'可用?這是關於現存最不可移植的噩夢。 – Jens

+0

你說得對。我修改了我的評論,僅適用於某些系統。 @Jens – alk

+0

如果擔心可移植性,可以閱讀'/ dev/fd /'。這比'/ proc/self/fd'更便於攜帶。 –

1

我的POSIX系統解決方案:

所有打開的fd是可能的最低值。
根據open(2)製作包裝功能。
您的新函數打開(並返回)所請求的fd並將其值傳遞給define_if_is_the_higtest_fd_and_store_it()函數。
您應該有一個int hightest_fd_saved僅適用於名爲save_fd()(初始值爲3(cuz stderr是2))的單例函數(只有1個「描述符表」)。
SIGINT配置爲您的信號功能。在裏面,你從[3,return_fd()]做一個循環。

我想就是這樣......

相關問題