分析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内核》里讲的有:
192725d700gowobidng0g8.png 
特定的事件都是有定义的,具体的百度下,本RC里用的,主要是两个:SIGUSR1(这个是用户自定义的)和SIGALRM(定时信号,用于与硬件相关操作)
193126jjjjz5gjz4z3zzkj.png 
在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的信号处理啦。
如果要自己新增功能,要在参数里加你程序需 要的参数,最后,加相应的通知,和通知相关的处理函数。
也有另一种做法,新增的程序,功能是执行一个脚本,然后从脚本时启动你想要的功能和程序。。。。。你以后想改,只需要改这个脚本就行,更有扩展性,对不对,感觉有点像宏内核与微内核的关系。

有时间,我来增加迅雷下载演示一下怎么加一个全新的功能。还有设置页面,

转载于:https://my.oschina.net/u/4000302/blog/3038768

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值