1 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個贊
//總結(jié):后面代碼不太相同;
//補(bǔ)充:
另外一個函數(shù)queue_builtin_action來向init進(jìn)程中的一個待執(zhí)行action隊(duì)列增加了一個名稱等于“console_init”的action。這個action對應(yīng)的執(zhí)行函數(shù)為console_init_action,它就是用來顯示第二個開機(jī)畫面的。
queue_builtin_action中也會執(zhí)行action_add_queue_tail;和接下來調(diào)用的action_for_each_trigger一樣;
action_list列表用來保存從啟動腳本/init.rc解析得到的一系列action,以及一系列內(nèi)建的action。當(dāng)這些action需要執(zhí)行的時候,它們就會被添加到action_queue列表中去,以便init進(jìn)程可以執(zhí)行它們。
回到init進(jìn)程的入口函數(shù)main中,最后init進(jìn)程會進(jìn)入到一個無限循環(huán)中去。在這個無限循環(huán)中,init進(jìn)程會做以下五個事情:
A. 調(diào)用函數(shù)execute_one_command來檢查action_queue列表是否為空。如果不為空的話,那么init進(jìn)程就會將保存在列表頭中的action移除,并且執(zhí)行這個被移除的action。由于前面我們將一個名稱為“console_init”的action添加到了action_queue列表中,因此,在這個無限循環(huán)中,這個action就會被執(zhí)行,即函數(shù)console_init_action會被調(diào)用。
B. 調(diào)用函數(shù)restart_processes來檢查系統(tǒng)中是否有進(jìn)程需要重啟。在啟動腳本/init.rc中,我們可以指定一個進(jìn)程在退出之后會自動重新啟動。在這種情況下,函數(shù)restart_processes就會檢查是否存在需要重新啟動的進(jìn)程,如果存在的話,那么就會將它重新啟動起來。
C. 處理系統(tǒng)屬性變化事件。當(dāng)我們調(diào)用函數(shù)property_set來改變一個系統(tǒng)屬性值時,系統(tǒng)就會通過一個socket(通過調(diào)用函數(shù)get_property_set_fd可以獲得它的文件描述符)來向init進(jìn)程發(fā)送一個屬性值改變事件通知。init進(jìn)程接收到這個屬性值改變事件之后,就會調(diào)用函數(shù)handle_property_set_fd來進(jìn)行相應(yīng)的處理。后面在分析第三個開機(jī)畫面的顯示過程時,我們就會看到,SurfaceFlinger服務(wù)就是通過修改“ctl.start”和“ctl.stop”屬性值來啟動和停止第三個開機(jī)畫面的。
D. 處理一種稱為“chorded keyboard”的鍵盤輸入事件。這種類型為chorded keyboard”的鍵盤設(shè)備通過不同的銨鍵組合來描述不同的命令或者操作,它對應(yīng)的設(shè)備文件為/dev/keychord。我們可以通過調(diào)用函數(shù)get_keychord_fd來獲得這個設(shè)備的文件描述符,以便可以監(jiān)控它的輸入事件,并且調(diào)用函數(shù)handle_keychord來對這些輸入事件進(jìn)行處理。
E. 回收僵尸進(jìn)程。我們知道,在Linux內(nèi)核中,如果父進(jìn)程不等待子進(jìn)程結(jié)束就退出,那么當(dāng)子進(jìn)程結(jié)束的時候,就會變成一個僵尸進(jìn)程,從而占用系統(tǒng)的資源。為了回收這些僵尸進(jìn)程,init進(jìn)程會安裝一個SIGCHLD信號接收器。當(dāng)那些父進(jìn)程已經(jīng)退出了的子進(jìn)程退出的時候,內(nèi)核就會發(fā)出一個SIGCHLD信號給init進(jìn)程。init進(jìn)程可以通過一個socket(通過調(diào)用函數(shù)get_signal_fd可以獲得它的文件描述符)來將接收到的SIGCHLD信號讀取回來,并且調(diào)用函數(shù)handle_signal來對接收到的SIGCHLD信號進(jìn)行處理,即回收那些已經(jīng)變成了僵尸的子進(jìn)程。
注意,由于后面三個事件都是可以通過文件描述符來描述的,因此,init進(jìn)程的入口函數(shù)main使用poll機(jī)制來同時輪詢它們,以便可以提高效率。
- 1 回答
- 0 關(guān)注
- 389 瀏覽
添加回答
舉報