可变长度结构
2015-09-16 15:40
120 查看
在分析按着原代码使用可变长度的结构工艺见过几个例子,体:
以下介绍安卓是怎样使用这个结构的,在解析init.rc文件的过程中。会使用这个结构体记录某些命令。
比方对于例如以下的section:
会调用parse_line_action函数来解析write
/proc/1/oom_adn -16,传入的參数中nargs=3,而cmd结构体中的args就是用来保存write /proc/1/oom_adj -16的。我们来看下,当解析完成上面section时的组织结构。
struct command { /* list of commands in an action */ struct listnode clist; int (*func)(int nargs, char **args); int nargs; char *args[1]; };
以下介绍安卓是怎样使用这个结构的,在解析init.rc文件的过程中。会使用这个结构体记录某些命令。
static void parse_line_action(struct parse_state* state, int nargs, char **args) { struct command *cmd; struct action *act = state->context; int (*func)(int nargs, char **args); int kw, n; if (nargs == 0) { return; } kw = lookup_keyword(args[0]); if (!kw_is(kw, COMMAND)) { parse_error(state, "invalid command '%s'\n", args[0]); return; } n = kw_nargs(kw); if (nargs < n) { parse_error(state, "%s requires %d %s\n", args[0], n - 1, n > 2 ? "arguments" : "argument"); return; } cmd = malloc(sizeof(*cmd) + sizeof(char*) * nargs); cmd->func = kw_func(kw); cmd->nargs = nargs; memcpy(cmd->args, args, sizeof(char*) * nargs); list_add_tail(&act->commands, &cmd->clist); }
比方对于例如以下的section:
on early-init # Set init and its forked children's oom_adj. write /proc/1/oom_adj -16 # Set the security context for the init process. # This should occur before anything else (e.g. ueventd) is started. setcon u:r:init:s0 start ueventd
会调用parse_line_action函数来解析write
/proc/1/oom_adn -16,传入的參数中nargs=3,而cmd结构体中的args就是用来保存write /proc/1/oom_adj -16的。我们来看下,当解析完成上面section时的组织结构。
相关文章推荐
- cmake编译参数
- 音乐的免费时代的终结者?
- mfc如何快速实现无边框窗口阴影效果
- linux基础二
- Android非空格式验证框架Validation的使用---第三方库学习笔记(四)
- 单词统计
- vmstat samples
- 【Nginx】Nginx学习笔记02_nginx+tomcat集群
- Android非空格式验证框架Validation的使用---第三方库学习笔记(四)
- Android4.4沉浸状态栏 键盘挤压布局受影响
- 《炉石传说》架构设计赏析(3):Gameplay初探
- 调用照相机和相册功能
- 连接到网络
- 《程序员面试金典》翻转子串
- Android非空格式验证框架Validation的使用---第三方库学习笔记(四)
- android ListView几个比较特别的属性
- php throw new Excpetion()之后,程序还往下继续运行吗?
- ios经典博客地址
- iostat samples
- test2.11