講解回調(diào)函數(shù)與鉤子函數(shù)(一文搞定~)
1、“回調(diào)”與“鉤子”
什么是回調(diào)函數(shù)?什么又是鉤子函數(shù)?目前對(duì)于這兩個(gè)概念的定義可能難以理解,在編程的過(guò)程中也是有點(diǎn)難區(qū)別,因?yàn)樗麄儽举|(zhì)上都是屬于函數(shù),只是說(shuō)是函數(shù)的一種應(yīng)用的形式不同罷了,既然我們這里談到這個(gè)話題那就好好分析分析。

? ? 不管是鉤子函數(shù)還是回調(diào)函數(shù)為了保持程序的靈活性,大部分都會(huì)采用函數(shù)指針的方式進(jìn)行設(shè)計(jì),所以一般小伙伴都直接認(rèn)為是函數(shù)指針的一種應(yīng)用,如果從語(yǔ)法的角度來(lái)看,確實(shí)是這么回事,可是我們需要換一個(gè)角度去看待一個(gè)事物,就像我們之前談面向?qū)ο缶幊?,如果你用面向過(guò)程的思維方式去理解面向?qū)ο蟮脑O(shè)計(jì)是難以理解的,所以這里的兩個(gè)概念也是一樣的。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?


2、回調(diào)函數(shù)
? ? 應(yīng)該很多小伙伴在編程中或者閱讀別人的代碼的時(shí)候都會(huì)看到callback的字樣,是的,回調(diào)函數(shù)的英文就是callback Fuction,從字面上來(lái)理解 :?反過(guò)來(lái)調(diào)用的函數(shù),那我們就需要知道它本來(lái)要去哪里,它又返回到什么地方執(zhí)行,好,下面作者給個(gè)簡(jiǎn)單的demo:
Demo:
最后輸出結(jié)果:

????其實(shí)從形式上看來(lái)確實(shí)沒(méi)有什么特別的就是函數(shù)指針的應(yīng)用,不過(guò)我們換一個(gè)角度,用分層的設(shè)計(jì)角度再對(duì)回調(diào)函數(shù)進(jìn)行理解,把Cal函數(shù)認(rèn)為是底層函數(shù)(也可以說(shuō)是庫(kù)函數(shù)),把main看成是上層應(yīng)用函數(shù),而add和sub認(rèn)為是上層的方法,現(xiàn)在main要讓底層Cal去進(jìn)行計(jì)算了,而我們的Cal函數(shù)再執(zhí)行過(guò)程中發(fā)現(xiàn)不知道用什么方法進(jìn)行計(jì)算,于是他又打道回府去拿到計(jì)算的方法,然后獲得最后的結(jié)果返回給main,那么這里的Sub和Add都認(rèn)為是回調(diào)函數(shù)。

3、鉤子函數(shù)
? ? 一看到鉤子(Hook)我們首先想到的動(dòng)作就是掛鉤,作者這里舉個(gè)例子:今天要吃魚(yú),去河邊釣魚(yú),于是我們準(zhǔn)備好釣魚(yú)竿,終于有魚(yú)上鉤了,一看原來(lái)是條小魚(yú),于是便放了,繼續(xù)釣魚(yú),接著釣了條大魚(yú),于是收工回去吃大餐。

? ? 所以鉤子函數(shù)看來(lái)就相當(dāng)于一個(gè)監(jiān)測(cè)器,在消息傳遞的過(guò)程中,捕獲自己感興趣的內(nèi)容,然后去處理,鉤子函數(shù)這個(gè)概念在消息機(jī)制中經(jīng)常會(huì)提到的,它也是一個(gè)函數(shù),一般是通過(guò)函數(shù)指針進(jìn)行靈活的注冊(cè),這樣一說(shuō),完了,分不清楚了,首先我們還是要選擇好角度,不確定角度真的說(shuō)不清。
????大家可能會(huì)發(fā)現(xiàn)鉤子函數(shù)也是用戶定義的,是不是也可以理解為一個(gè)回調(diào)函數(shù)呢?形式上確實(shí)可以認(rèn)為鉤子函數(shù)也是一種回調(diào)函數(shù),不過(guò)這樣沒(méi)有什么意義,我還可以說(shuō)他們都是函數(shù)呢?還是要從函數(shù)的功能上區(qū)分,回調(diào)函數(shù)更多的是目的處理,而鉤子函數(shù)更多的是過(guò)程監(jiān)控,對(duì)于鉤子函數(shù)的應(yīng)用在rt-thread或者FreeRtos中都使用得非常多。
RT-Thread中截取的鉤子函數(shù)代碼參考:

? ? RT-Thread通過(guò)一個(gè)宏定義來(lái)讓用戶決定是否開(kāi)啟鉤子函數(shù)功能,上面每次進(jìn)入中斷都會(huì)調(diào)用對(duì)應(yīng)的鉤子函數(shù),具體鉤子函數(shù)根據(jù)自身需求進(jìn)行設(shè)計(jì),比如統(tǒng)計(jì)或者監(jiān)控等等功能。
原文作者:最后一個(gè)bug
