变长结构体的使用

来源:互联网 发布:矩阵切换器怎么使用 编辑:程序博客网 时间:2024/05/21 22:48

在分析安卓源码过程中看到几处使用变长结构体的例子,比如下面的结构体:

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时的组织结构。




0 0