接着上回说:
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的信号处理啦。如果要自己新增功能,要在参数里加你程序需 要的参数,最后,加相应的通知,和通知相关的处理函数。也有另一种做法,新增的程序,功能是执行一个脚本,然后从脚本时启动你想要的功能和程序。。。。。你以后想改,只需要改这个脚本就行,更有扩展性,对不对,感觉有点像宏内核与微内核的关系。有时间,我来增加迅雷下载演示一下怎么加一个全新的功能。还有设置页面,