skynet源码分析(11)--skynet的配置加载

本文分析了skynet如何加载和解析lua格式的配置文件。从main函数开始,介绍了配置文件路径的读取,lua C API在加载配置过程中的作用,特别是`load_config`和`_init_env`函数如何处理配置。同时讲解了C层获取配置的辅助函数`optint/optboolean/optstring`,以及`skynet_getenv`和`skynet_setenv`的工作原理。
摘要由CSDN通过智能技术生成

作者:shihuaping0918@163.com,转载请注明作者

skynet中的源码已经分析得差不多了,还有启动过程没有分析。skynet的配置文件是以lua格式来写的。使用过skynet的都清楚skynet的启动命令是skynet config_file_name。配置文件名是作为命令行参数传给skynet进程的。

skynet进程启动以后,会读取config文件,然后解析这个lua文件。然后把相关的配置信息设置到lua的环境变量里。

C层读取配置的话是要从lua环境变量里去取的。所以C的配置数据结构的填充,对于某些人来说,是一团迷雾,不直观,而且难懂。

先看看配置文件路径的读取,skynet是用C写的,所以它的入口是main函数,在skynet_main.c中:

int
main(int argc, char *argv[]) {
    const char * config_file = NULL ; //配置文件路径
    if (argc > 1) {
        config_file = argv[1]; //注意写死了,它就是第一个参数
    } else {
        fprintf(stderr, "Need a config file. Please read skynet wiki : https://github.com/cloudwu/skynet/wiki/Config\n"
            "usage: skynet configfilename\n");
        return 1;
    }

这个配置文件的路径保存在config_file指针上,那么它是怎么加载的呢,这个又要涉及lua c api了。首先,云风写了一段lua代码,硬编码在skynet_main.c文件里,然后调用lua c api的函数去执行这段代码。这段lua代码会加载配置文件。先看一下这段lua代码:

static const char * load_config = "\
    local result = {
   }\n\
--函数 getenv
--这个getenv是取进程的环境变量,比如$PATH
    local function getenv(name) return assert(os.getenv(name), [[os.getenv() failed: ]] .. name) end\n\
--取文件路径分隔符
    local sep = package.config:sub(1,1)\n\
--当前路径,linux下就是./
    local current_path = [[.]]..sep\n\
--函数 include
    local function include(filename)\n\
        local last_path = current_path\n\
        local path, name = filename:match([[(.*]]..sep..[[)(.*)$]])\n\
        if path then\n\
            if path:sub(1,1) == sep then    -- root\n\
                current_path = path\n\
            else\n\
                current_path = current_path .. path\n\
            end\n\
        else\n\
            name = filename\n
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值