下面呢,我们接着上一期的内容来讲解
lookup_keyword
,下面我们来具体看一下这个函数的实现
这个函数就是根据我们传进来的字符串来匹配一个和命令相关的结构体,我们来看一下我们结构体的定义
第一个就是一个name
,这个
name
和我们的命令相对应,第二个是我们这个命令所对应的一个函数,第三个对应的是我们
args
的一个参数,最后一个是结构体所对应的一个类型,我们再回过头来看我们的第一张图,看我们以
c
打头的所有的命令,包括我们的拷贝、
chdir
、
chroot
、
class
等一系列的操作命令都会在这里对应一个结构体,那我们再来看一下这个结构体是在哪里定义的
在这个文件中定义了一系列的操作,比如我们的do_chroot
、
do_chdir
等,在下面会对应一个枚举类型,而他们又会和我们的
K_copy
、
K_capacity
等相对应,这样我们就能知道每一个结构体的具体含义,包括我们的名字、类型、参数、以及执行函数,这样我们所有的脚本中的命令就和我们的结构相关联起来
下面我们来看一下我们的
parse_new_section
他在这里是解析三个状态的,第一个是解析我们的
service
,第二个解析
action
,第三个是
import
,和我们上一章所说的数据结构对应起来,如果说我们解析的是一个
service
,他会加入到我们的
service_list
列表中,同样的
action
和
import
也是一样的,都会加入到他们相应的列表中,
struct parse_state
是和我们
parse_service
和
parse_action
相对应的一个函数,如果说我们调用的是一个
parse_service
,那么我们就会在解析这一行的时候就会调用
parse_line_service
,同样另一个也是这样的,下面我们来看一下我们是如何通过这几个函数把我们的数据添加到列表中,我们看一下
init
事件的列表
第一个是我们的service_list
,他是添加所有的服务列表,是被我们的
parse_service
调用的,而我们的
action_list
是被我们的
parse_action
调用的,在这时也会有一些选项,比如
on early
、这就相当于一个
session
,该
session
下的所有操作都会添加到一个相应的节点中,那我们的
action_list
他是把我们的
service_list
和
action_list
中所有的一些服务插到
action_queue
中,这个
action_queue
是当我们启动服务的时候来使用的,那我们来看一下解析过程和数据是怎样对应起来的大家来看这个示意图
在我们parse
过程中我们主要使用四个函数,第一个是
parse_action
,它主要是把我们的
action
添加到
action_list
中,我们可以以
init.rc
来作为列子看一下,首先比如说我们遇到了一个
on early-init
,我们会认为他是一个新的
session
,然后我们就会将他添加到
action_list
中,在
on early-init
下也会有很多操作,比如
write
、
setcon
等,http://tiyubisai.com/video_news/news_135537.html 我们都会认为他们是
action
下面的节点操作,也就是调用我们的
parse_line_action
,来把后边的这些操作添加到
action1
下面(一个
session
下面可以执行多个操作)这就是
parse_action
和
parse_line_action
所做的事情。如果说我们后面遇到了第二个
session
,这时候我们就会添加一个新的节点,也就是
action2
,相应的在节点下面的操作也会添加到
action2
下面。
然后再来看一下
parse_service
,主要是把
service
添加到我们的
service_list
列表中,如果说我们遇到了一个函数是
service
的话,他会把我们的
service
函数制成我们的
parse_line_service
,然后他就会解析
service
后面所有的参数,比如他的
flag
、
user
等全部添加到
service1
的节点中,在
service
后面呢会跟一些参数。她的下面会加一些
class
属性,我们都会把他们解析出来,然后添加到
service
节点中,这就是
service on
事件的一个解析过程,当然他还有一个
parse_line_service
,也就是我们的一个导入的启动脚本,他也会有相关的操作,下面我们来看一下
parse_new_section
是如何来实现的
如果说我们的kw
返回的类型是
K_service
,那么我们就会认为他是一个
service
的
session
,那么就会调用
parse_service
,我们来看一下
parse_service
的实现
我们首先看一下这个服务参数是否正常,有没有重定义的,如果这些都正常,他就会创建一个SVC结构,把这个结构添加到我们的service_list
中
这就是我们parse_service
所做的事情,当我们创建完这个
session
之后,我们会把我们的
parse_line
设置成
parse_line_service
,他所做的事情就是来解析我们后边的一些属相,并且把这些属相添加到我们的节点中。如果说我们碰到的是一个
on
打头的脚本,那么他就会认为是
parse_action
,并且把
parse_line
也定义为
parse_line_action
,
parse_action
所做的事情就是申请一个节点,并且把这个节点添加到我们的
action_list
中,
parse_line_action
的过程就是拿到了一个新的操作结构体,并且看一下结构的具体类型,然后把它添加到
act commands
中
这就是我们的
parse_line_action
和
parse_action
所做的事情
最后呢我们看一下我们的
K_import
他的操作就是把我们的启动脚本加到我么的imoprt_list
中,当我们解析完一个脚本之后,他就会去解析其他的启动脚本
到这里我们的启动脚本的过程就算讲完了
http://blog.csdn.net/chengfeng135/article/details/49618873
http://blog.csdn.net/chengfeng135/
|
android教程学习 第12讲:lookup_keyword这个函数的实现
最新推荐文章于 2024-04-30 11:30:00 发布