?? Callback ? Function: ? 回調(diào)函數(shù) ?
? ? ? ? ? 在侯sir的<<深入淺出>>中一開始就提出了這個(gè)概念,大概的提法是說回調(diào)函數(shù)是操作系統(tǒng)調(diào)用而你永遠(yuǎn)不要去調(diào)用的函數(shù)。這個(gè)提法讓初學(xué)者有點(diǎn)望而生畏,以為是一種多么高深而難以領(lǐng)會(huì)的系統(tǒng)底層的核心技術(shù)。其實(shí)不然,這個(gè)技術(shù)本質(zhì)很簡(jiǎn)單,而且很常用。它實(shí)質(zhì)就是函數(shù)指針的基本運(yùn)用(如果不知道什么是函數(shù)指針的話,翻翻書)。在一個(gè)模塊中,有時(shí)想讓一部分功能由其它模塊實(shí)現(xiàn),譬如說一個(gè)做顯示的模塊,它只想實(shí)現(xiàn)顯示的資源配備,畫面的刷新,縮放等,而把畫具體實(shí)體(譬如圓、多邊形)的代碼放到別的模塊來實(shí)現(xiàn),怎么辦呢?用函數(shù)指針。在自己的類中放一個(gè)畫圓的函數(shù)指針,使用時(shí)由外部為這個(gè)函數(shù)指針賦值(其實(shí)就是指向了一個(gè)外部的函數(shù)),在自己的代碼中直接調(diào)用這個(gè)函數(shù)指針來畫就可以了(本模塊完全不知道外部模塊是怎么畫圓的)。那個(gè)外部的函數(shù)在這里就是回調(diào)函數(shù)! ?
? ? ? ? ? 在很多系統(tǒng)API中就使用了這種函數(shù)回調(diào)的方法,讓我們開發(fā)的代碼實(shí)現(xiàn)可以嵌入到API的代碼實(shí)現(xiàn)當(dāng)中,其實(shí)我們就是傳了一個(gè)函數(shù)地址給它而已。換句話說,這些API搭好了某些運(yùn)行的代碼框架,我們來為它具體實(shí)現(xiàn)。在自己的代碼中這種技術(shù)也常常被用到。舉個(gè)典型的例子,寫COM(串口)讀寫代碼時(shí),常常單獨(dú)實(shí)現(xiàn)一個(gè)模塊來讀寫串口,而這個(gè)模塊則開放一個(gè)回調(diào)函數(shù)接口,使得每讀完若干字節(jié)數(shù)據(jù)(譬如說自定義通訊數(shù)據(jù)的一幀)就調(diào)用一次這個(gè)函數(shù),而這個(gè)函數(shù)是由上層調(diào)用模塊實(shí)現(xiàn)的,具體進(jìn)行數(shù)據(jù)的解析、處理。這就是回調(diào)。這有什么好處呢?實(shí)現(xiàn)了功能的分離,這個(gè)串口模塊會(huì)有良好的重用性。還不明白的話,請(qǐng)仔細(xì)想想:) ?
? ?
? ? ? ? ? 守護(hù)進(jìn)程 ?
? ? ? ? ? 這個(gè)概念我更拿不準(zhǔn)了。好像這是指從系統(tǒng)開始一直到系統(tǒng)結(jié)束一直在運(yùn)行,長(zhǎng)駐內(nèi)存的線程。譬如說Win32的很多服務(wù)進(jìn)程,都可以稱作守護(hù)進(jìn)程。守護(hù)進(jìn)程往往會(huì)獲得較高的系統(tǒng)核心等級(jí),使得不容易被kill掉。因其特點(diǎn),一些病毒,監(jiān)控程序往往實(shí)現(xiàn)為守護(hù)進(jìn)程。當(dāng)然,這絕不是把程序放到“啟動(dòng)”中可以實(shí)現(xiàn)的,那個(gè)時(shí)候啟動(dòng),已經(jīng)太晚。我猜想(沒真正做過)要實(shí)現(xiàn)的話,可以注入到一些系統(tǒng)核心DLL里,一旦這些DLL啟動(dòng)時(shí)激活自己的進(jìn)程,或者實(shí)現(xiàn)為Windows的服務(wù)進(jìn)程,常規(guī)編程里很少使用到這個(gè)技術(shù)。
posted on 2006-05-14 12:58
太極虎~宏 閱讀(131)
評(píng)論(0) 編輯 收藏 引用