在分析安卓源码过程中看到几处使用变长结构体的例子,比如下面的结构体:
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时的组织结构。
本文详细介绍了安卓源码中如何使用变长结构体,并通过解析init.rc文件的过程,展示了如何解析特定命令及其参数。重点分析了如何利用变长结构体记录命令和参数,以及解析过程中的关键步骤。
6368

被折叠的 条评论
为什么被折叠?



