/proc
/sys
/tmp
/dev
/dev/pts
目錄(early_mount)建立子進程執行/etc/preinit腳本,此時PREINIT環境變量被設置爲1,主進程同時使用uloop_process_add()把/etc/preinit子進程加入uloop進行監控,當/etc/preinit執行結束時回調plugd_proc_cb()函數把監控/etc/preinit進程對應對象中pid屬性設置爲0,表示/etc/preinit已執行完成shell
建立子進程執行/sbin/procd -h
/etc/hotplug-preinit.json,主進程同時使用uloop_process_add()把/sbin/procd子進程加入uloop進行監控,當/sbin/procd進程結束時回調spawn_procd()函數json
spawn_procd()函數繁衍後繼真正使用的/sbin/procd進程,從/tmp/debuglevel讀出debug級別並設置到環境變量DBGLVL中,把watchdog fd設置到環境變量WDTFD中,最後調用execvp()繁衍/sbin/procd進程數據結構
若是存在/dev/watchdog設備,設置watchdog timeout等於30秒,若是內核在30秒內沒有收到任何數據將重啓系統。用戶狀進程使用uloop定時器設置5秒週期向/dev/wathdog設備寫一些數據通知內核,表示此用戶進程在正常工做函數
/** * 初始化watchdog */ void watchdog_init(int preinit) /** * 設備通知內核/dev/watchdog頻率(缺省爲5秒) * 返回老頻率值 */ int watchdog_frequency(int frequency) /** * 設備內核/dev/watchdog超時時間 * 當參數timeout<=0時,表示從返回值獲取當前超時時間 */ int watchdog_timeout(int timeout) /** * val爲true時中止用戶狀通知定時器,意味着30秒內系統將重啓 */ void watchdog_set_stopped(bool val)
信息處理,下面爲procd對不一樣信息的處理方法oop
procd有5個狀態,分別爲STATE_EARLY
、STATE_INIT
、STATE_RUNNING
、STATE_SHUTDOWN
、STATE_HALT
,這5個狀態將按順序變化,當前狀態保存在全局變量state
中,可經過procd_state_next()
函數使用狀態發生變化spa
STATE_EARLY
轉變爲STATE_INIT
main_object
對象,system_object
對象、watch_event
對象(procd_connect_ubus()函數),respawn
、askconsole
、askfirst
、sysinit
命令STATE_INITl
轉變爲STATE_RUNNING
STATE_RUNNING
狀態後procd運行uloop_run()
主循環struct trigger { struct list_head list; char *type; int pending; int remove; int timeout; void *id; struct blob_attr *rule; struct blob_attr *data; struct uloop_timeout delay; struct json_script_ctx jctx; }; struct cmd { char *name; void (*handler)(struct job *job, struct blob_attr *exec, struct blob_attr *env); }; struct job { struct runqueue_process proc; struct cmd *cmd; struct trigger *trigger; struct blob_attr *exec; struct blob_attr *env; };
/** * 初始化trigger任務隊列 */ void trigger_init(void) /** * 把服務和服務對應的規則加入trigger任務隊列 */ void trigger_add(struct blob_attr *rule, void *id) /** * 把服務從trigger任務隊列中刪除 */ void trigger_del(void *id) /** * */ void trigger_event(const char *type, struct blob_attr *data)
Name | Handler | Blob_msg policy |
---|---|---|
set | service_handle_set | service_set_attrs |
add | service_handle_set | service_set_attrs |
list | service_handle_list | service_attrs |
delete | service_handle_delete | service_del_attrs |
update_start | service_handle_update | service_attrs |
update_complete | service_handle_update | service_attrs |
event | service_handle_event | event_policy |
validate | service_handle_validate | validate_policy |
Name | Handler | Blob_msg policy |
---|---|---|
board | system_board | |
info | system_info | |
upgrade | system_upgrade | |
watchdog | watchdog_set | watchdog_policy |
signal | proc_signal | signal_policy |
nandupgrade | nand_set | nand_policy |
代碼庫路徑: package/system/procd/files/procd.sh
設備上路徑: /lib/functions/procd.shdebug
/etc/init.d/daemoncode
#!/bin/sh /etc/rc.common START=80 STOP=20 USE_PROCD=1 start_service() { procd_open_instance procd_set_param command /sbin/daemon procd_set_param respawn procd_close_instance }