博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分析Padavan源代码,二
阅读量:6704 次
发布时间:2019-06-25

本文共 1807 字,大约阅读时间需要 6 分钟。

hot3.png

接着上回说:

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

你可能感兴趣的文章
对Kalman(卡尔曼)滤波器的理解
查看>>
【转】 Android BCM4330 蓝牙BT驱动调试记录
查看>>
NBear简介与使用图解
查看>>
[转]Apache重写中的flag说明
查看>>
iPhone控件之UILabel
查看>>
NHibernate自定义集合类型(上):基本实现方式
查看>>
IE9的css hack
查看>>
BZOJ 3218(a + b Problem-二分图套值域线段树)
查看>>
android 常用资料
查看>>
Web版RSS阅读器(三)——解析在线Rss订阅
查看>>
Android大图片导致内存问题小结
查看>>
SQL SERVER 服务启动后停止,某些服务由其它服务或程序使用时将自动停止
查看>>
能够免费做商业站点的CMS讨论
查看>>
Aix db2 经user a using b连接时报SQL30082N Security processing failed with reason &quot;42&quot;...
查看>>
Java - 容器详解
查看>>
Microsoft Build 2016 Day 2 记录(多图慎入)
查看>>
word异常关闭,找到丢失的word
查看>>
香港中大完成全球首个多专科单孔微创机械人手术临床研究
查看>>
JS专题之事件模型
查看>>
Android组件化搭建分享
查看>>