接着上回说: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