分析之前先搭好环境,找好日志输出函数,接下去就是边看代码边打日志。如果有不懂的,就自己代码测试。
main函数主流程:
1、luaS_initshr:初始化操作。
2、skynet_globalinit:全局静态skynet_node节点初始化。
3、skynet_env_init:全局静态虚拟机创建初始化。
4、sigign:SIG_IGN信号处理。
5、lua加载配置文件并初始化
struct lua_State *L = luaL_newstate();
luaL_openlibs(L); // link lua lib
int err = luaL_loadstring(L, 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);
//环境变量获取并赋值
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);
6、skynet_start:根据配置参数启动skynet。
7、skynet_globalexit:全局skynet_node删除。
8、luaS_exitshr:lua环境退出。
本文详细解析了Skynet启动过程中的关键步骤,包括lua环境的初始化、全局节点和虚拟机的初始化、信号处理、配置文件加载及环境变量设置等。通过深入代码层面,帮助读者理解Skynet的工作机制。
4015

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



