Skynet:工作逻辑

本文详细介绍了Skynet框架的启动流程,从`skynet_main.c`的`main`函数开始,深入到`skynet_start.c`中的`skynet_start`函数。主要内容包括初始化、配置加载、服务创建,特别是多线程的设计:监测线程负责检查工作线程是否卡死,定时器线程处理计时和唤醒工作线程,套接字线程处理套接字事件,而工作线程则处理服务消息。整个框架设计确保了服务的高效运行和异常监测。
摘要由CSDN通过智能技术生成


当从终端输入命令“./skynet examples/config”命令时,启动程序skynet,首先调用skynet_main.c文件中的main函数,examples/config将作为argv[1]参数传入。在main函数中主要的工作为:初始化全局信息,加载配置文件,调用skynet_start.c中的skynet_start函数。skynet_start函数的主要的工作为:根据加载的配置信息初始化全局信息,创建一个logger服务,调用bootstrap函数创建一个snlua服务,调用start函数创建一个监测线程、一个定时器线程、一个套接字线程以及配置配的相应数量的工作线程。
skynet_main.c文件中的main函数源码注释

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;
    }

    luaS_initshr();        //初始化读写锁
    skynet_globalinit();    //初始化主线程
    skynet_env_init();        //初始化一个全局的Lua环境

    sigign();    //忽略SIGPIPE信号

    struct skynet_config config;

    struct lua_State *L = luaL_newstate();        //新建一个lua状态机
    luaL_openlibs(L);    // link lua lib

    int err =  luaL_loadbufferx(L, load_config, strlen(load_config), "=[skynet config]", "t");    //加载load_config中的代码块
    assert(err == LUA_OK);
    lua_pushstring(L, config_file);        //将配置文件的路径压入栈

    err = lua_pcall(L, 1, 1, 0);        //运行加载的代码块,并将配置文件路径作为参数传入
    if (err) {
   
        fprintf(stderr,"%s\n",lua_tostring(L,-1));
        lua_close(L);
        return 1;
    }
    _init_env(L);        //将配置文件的键值对添加到lua全局信息内

    config.thread =  optint("thread",8);
    config.module_path = optstring("cpath","./cservice/?.so");
    config.harbor = optint("harbor", 1);
    config.bootstrap = optstring("bootstrap","snlua bootstrap");
    config.daemon = optstring("daemon", NULL);
    config.logger = optstring("logger", NULL);
    config.logservice = optstring("logservice", "logger");
    config.profile = optboolean("profile", 1);

    lua_close(L);        //消耗上面创建的lua状态机

    skynet_start(&config);        //skynet开始
    skynet_globalexit();
    luaS_exitshr();

    return 0;
}

skynet_start.c文件中的skynet_start函数源码注释

void skynet_start(struct skynet_config * config) {
   
    // register SIGHUP for log file reopen
    //log默认是输出到终端的,如果终端关闭则将log输出到文件
    struct sigaction sa;
    sa.sa_handler = &handle_hup;
    sa.sa_flags = SA_RESTART;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值