分析Padavan源代碼,二

接着上回說:https://www.right.com.cn/forum/thread-212972-1-1.html
rc的init過程:
rc.c 裏的main()函數裏,若是是執行的程序是init,會執行到這:init_main_loop()//代碼在init.c

/* Basic initialization */
init_time();//設置時間
system("dev_init.sh")//這句會執行/sbin/dev_init.sh ,dev_init.sh又會執行/sbin/mtd_storage.sh 創建各大種腳本, //,執行 啓動腳本-初始化,就是自定義設置-》腳本-》[url=]在路由器初始化前執行:[/url]
init_nodes();//創建設備節點
init_mdev();//安裝設備驅動,/etc/mdev.conf是從重建的,哈哈,
....
init_router(); //這是一個重要函數,啓動路由的各個服務(就是各個程療啦,代碼位於rc.c) //把各類服務啓動後,會執行啓動後腳本,就是自定義設置-》腳本-》[url=]在路由器啓動後執行:[/url]
                                                      //因此,要本身加一個新的程序能開機就啓動,要在這裏面加代碼哦,或者寫在啓動後執行的腳本里。。。。。。。
下面進入信號的處理,init進程變成一個後臺 通知服務,處理各類通知

仍是科普下linux的信號處理機制:《深刻理解linux內核》裏講的有:
 
特定的事件都是有定義的,具體的百度下,本RC裏用的,主要是兩個:SIGUSR1(這個是用戶自定義的)和SIGALRM(定時信號,用於與硬件相關操做)
 
在shared/notify_rc.c裏,是全部產生通知的地方,會在"/tmp/rc_notification" "/tmp/rc_action_incomplete" 這兩個文件夾,創建通知名稱,而後用kill(1, SIGUSR1);通知/init 程序執行信號處理(init的pid=1,內核啓動後啓動的第一個程序)
看init.c裏信號處理主循環的代碼:
                if (sig_usr1_received) {
                        sig_usr1_received = 0;
                        handle_notifications();
                }
                if (sig_alrm_received) {
                        sig_alrm_received = 0;
#if defined (USE_USB_SUPPORT) || defined (USE_STORAGE)
                        on_deferred_hotplug_dev();
#endif

若是是一些通知,發送kill(1, SIGUSR1)過來的,會執行handle_notifications();//一個超長超多if...elseif...else,裏面就是各個通知怎麼處理啦
若是支持USB,有定時信號(像由handle_notifications()也會產生些,看代碼nvram_set_int_temp("usb_hotplug_md", 1);alarm(5);)alarm()這個函數,會觸發SIGALRM信號。
因此,繞來繞去,又到了rc裏了。


不少人想加功能麼,首先要這個程序自己能運行,對吧,都不能運行確定就不行啦,咱們想要的,是要能更方便的修改這個程療的參數。這就是網頁端存在的理由。
這個網頁端的每一個頁面,都是表單與提交表單,
響應的頁面start_apply.htm吧。最行,都執行了這三個函數:
<% update_variables(); %>//更新參數,會執行user\httpd\web_ex.c裏的update_variables_ex()
<% asus_nvram_commit(); %>//更新nvram
<% notify_services(); %>//通知相應服務重啓,這裏也繞到rc的init的信號處理啦。
若是要本身新增功能,要在參數里加你程序需 要的參數,最後,加相應的通知,和通知相關的處理函數。
也有另外一種作法,新增的程序,功能是執行一個腳本,而後從腳本時啓動你想要的功能和程序。。。。。你之後想改,只須要改這個腳本就行,更有擴展性,對不對,感受有點像宏內核與微內核的關係。

有時間,我來增長迅雷下載演示一下怎麼加一個全新的功能。還有設置頁面,html

相關文章
相關標籤/搜索