• 可变长度结构


    在分析按着原代码使用可变长度的结构工艺见过几个例子,体:

    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'
    ", args[0]);
            return;
        }
    
        n = kw_nargs(kw);
        if (nargs < n) {
            parse_error(state, "%s requires %d %s
    ", 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时的组织结构。




    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Selenium
    Selenium和ChromeDriver下载地址
    CQRS Event Sourcing介绍
    JAVA程序员面试30问(附带答案)
    拼多多、饿了么、蚂蚁金服Java面试题大集合
    40K刚面完Java岗,这些技术必须掌握
    接口测试之深入理解HTTPS
    选择了软件测试,你后悔吗?
    如何优雅的使用 Python 实现文件递归遍历
    刚从阿里回来,有些想法想跟测试员说说
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4813499.html
Copyright © 2020-2023  润新知