2015-06-28 55 views

回答

3

open函數是創建流的fopenfreopen函數的基礎原語。

int open (const char *filename, int flags[, mode_t mode]) 

創建並返回一個新的文件描述filename命名的文件。參數mode僅在創建文件時使用,但在任何情況下都不會影響提供參數。

所以每當一個openfopen調用時創建一個新的文件描述這些描述住宿分配,直到程序結束。

函數closefclose關閉文件描述符字段。關閉文件具有以下後果:

  • 將文件描述符解除分配。
  • 解鎖文件上的進程擁有的任何記錄鎖。
  • 當與管道或FIFO關聯的所有文件描述符已關閉時,將丟棄任何未讀數據。

如果openfopen也不要close,那麼描述將不被清理,並且將持續到程序關閉。

如果有很多可能會被多次打開(而不必每次關閉)的open或任何文件調用的問題很嚴重,那麼描述將泄露,直到OS或者拒絕或無力創建另一個描述符,在這種情況下,對fopen的調用失敗並且程序可能崩潰。

在大多數POSIX操作系統(包括Linux和Os X)上,每個進程都分配了一個固定的文件句柄表或文件描述符表。這通常約爲1024個手柄。當您嘗試打開第1025個文件描述符時,操作系統會終止您的進程。

問題幾乎可以肯定是你正在泄漏文件句柄。也就是說,句柄正在被打開,並且在你完成它們之後,它們不會被關閉。

爲了避免描述泄漏,必須需要每次文件被重新打開,以closefclose之前。

看看GNU描述的關於Opening and Closing Files

+0

你在這裏說描述符泄漏。那究竟意味着什麼? – ameyCU

+0

@ameyCU編輯了答案。再看一看。 –

+0

謝謝:)它解釋了很多! – ameyCU

4

每次打開文件時,都會收到不同的文件描述符或文件句柄。因此,如果通過fopen()close()打開,則必須使用fclose()關閉每個文件句柄(如果通過open()打開)。

+0

......或'close()'如果通過'open()'打開。 – alk

+0

@alk Thanks alk編輯了答案 – Steephen

1

你必須關閉所有這些。

當您使用open - 家庭系統調用,他們返回你file-descriptorfopen回報FILE*這基本上是containts文件描述符的結構體。對文件定義一看)。

typedef struct 
{ 
short level ; 
short token ; 
short bsize ; 
char fd ; <-- here 
unsigned flags ; 
unsigned char hold ; 
unsigned char *buffer ; 
unsigned char * curp ; 
unsigned istemp; 
}FILE ; 

結果fopen()你會給你兩種不同的FILE *(和不同的文件描述符明顯),你應該close()/fclose()最後。

+0

並解釋得很好。但是我應該怎麼做才能避免這樣的事情? – ameyCU

+0

我不認爲僅僅保存兩個文件描述符而不是一個太糟糕,並關閉它們。這真的取決於你想要做什麼。 –

相關問題