「洩漏」是我們寫程式的人老生常談的乙個話題。最為常見的就是記憶體洩漏(memory leak),本文介紹一種新的洩漏—控制代碼洩漏(handle leak)。在windows系統的程式中,我們經常會遇到控制代碼這個詞,而且windows也抽象出了一種控制代碼型別handle。在unix系統的系統中,控制代碼這個詞用的不是很多。我們用另乙個詞描述它—檔案描述符(file descriptior)。這裡的檔案是指廣義的檔案,因為在unix系統中,everything is a file。總的說來,控制代碼是指作業系統給我們的應用程式的程序分配的,用來標識某種資源的符號。這裡的資源,可以是狹義的檔案,可以是socket連線,也可以是乙個物件。
現在,這裡以linux環境中的乙個socket連線中的控制代碼洩漏的例子來說明控制代碼洩漏的情況:有三個應用程式a,b,c,它們執行在不同的機器上,它們之間通過socket介面進行通訊。其中a和b之間通訊,a是服務端;b是客戶端,b和c之間通訊,b是服務端,c是客戶端。它們之間的通訊都是tcp的。現在,b要給a傳送資料,b在傳送前,如果發現和a之間的連線斷開,就會去重連,在重連的時候,b並沒有close已經斷開連線的socket id。這樣,b重連a多次之後,作業系統分配給它的socket id都將會被用完。那麼,現在c如果來連線b, 就會出現b拒絕c連線的情況,為什麼會這樣呢?因為b程序裡面已經沒有可用來標識該連線的socket id,所以b只能拒絕服務。
上面就是乙個socket控制代碼洩漏的例子。解決上面的問題的具體方法是:在b每次重連a的時候,呼叫系統提供的close()函式,把已經斷開連線的socket的socket id釋放。 舉上面的例子,一方面是說明控制代碼洩漏的一種情況,另一方面,也是比較重要的方面,是讓大家重視控制代碼的使用,能夠正確使用控制代碼,一定要做到申請乙個,就要時刻記得釋放乙個,要把申請和釋放一一對應起來。就像記憶體使用中的malloc/free, new/delete一樣,控制代碼的使用,申請和釋放的api也要配對使用。
不管是記憶體也好,還是控制代碼也好,都是可以統稱為資源的,對資源的使用,要求都是統一的,就是要「有借有還,再借不難」。我們要謹記「文明」使用作業系統提供給我們的資源,力爭寫出更加「和諧」的程式來!
談」控制代碼洩漏「
洩漏 是我們寫程式的人老生常談的乙個話題。最為常見的就是記憶體洩漏 memory leak 本文介紹一種新的洩漏 控制代碼洩漏 handle leak 在windows系統的程式中,我們經常會遇到控制代碼這個詞,而且windows也抽象出了一種控制代碼型別handle。在unix系統的系統中,控制代...
檢查除錯控制代碼洩漏
windows任務管理檢視控制代碼數 任務管理 檢視 選擇列 勾選 控制代碼數 process explorer檢視控制代碼詳細資訊 process explorer 中雙擊指定程序開啟程序的properties視窗,切換到performance標籤頁,可以看到比任務管理器更詳細的統計資料。包括ha...
檔案控制代碼和檔案控制代碼洩漏解決
在檔案i o中,要從乙個檔案讀取資料,應用程式首先要呼叫作業系統函式並傳送檔名,並選乙個到該檔案的路徑來開啟檔案。該函式取回乙個順序號,即檔案控制代碼 file handle 該檔案控制代碼對於開啟的檔案是唯一的識別依據。要從檔案中讀取一塊資料,應用程式需要呼叫函式readfile,並將檔案控制代碼...