lua_pcall(L, 1, 1, 0);
执行压入的 load_config 代码块 。第二个参数1 表示压入的栈的个数为1 。lua_pushstring(L, config_file); 被压栈的配置文件名 。执行完函数之后 。函数和参数全自动出栈 。此时栈为空 。函数的返回值被压栈 。此时栈内只有一个表 result, result 内内含了配置在 config_file 内的键值对 。
_init_env(L);
static void_init_env(lua_State *L) {lua_pushnil(L); /* first key */while (lua_next(L, -2) != 0) {int keyt = lua_type(L, -2);if (keyt != LUA_TSTRING) {fprintf(stderr, "Invalid config table\n");exit(1);}const char * key = lua_tostring(L,-2);if (lua_type(L,-1) == LUA_TBOOLEAN) {int b = lua_toboolean(L,-1);skynet_setenv(key,b ? "true" : "false" );} else {const char * value = https://www.wangchuang8.com/lua_tostring(L,-1);if (value == NULL) {fprintf(stderr, "Invalid config table key = %s/n", key);exit(1);}skynet_setenv(key,value);}lua_pop(L,1);}lua_pop(L,1);}// skynet/skynet-src/skynet_env.cvoid skynet_setenv(const char *key, const char *value) {SPIN_LOCK(E)lua_State *L = E-L;lua_getglobal(L, key);assert(lua_isnil(L, -1));lua_pop(L,1);lua_pushstring(L,value);lua_setglobal(L,key);SPIN_UNLOCK(E)}// 从堆栈上弹出一个值 。并将其设为全局变量 name 的新值 。void lua_setglobal (lua_State *L, const char *name);// 把全局变量 name 里的值压栈 。返回该值的类别。int lua_getglobal (lua_State *L, const char *name);将lua栈表内的键值对设置到 &E-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);static intoptint(const char *key, int opt) {const char * str = skynet_getenv(key);if (str == NULL) {char tmp[20];sprintf(tmp,"%d",opt);skynet_setenv(key, tmp);return opt;}return strtol(str, NULL, 10);}// skynet/skynet-src/skynet_env.cconst char * skynet_getenv(const char *key) {SPIN_LOCK(E)lua_State *L = E-L;lua_getglobal(L, key);const char * result = lua_tostring(L, -1);lua_pop(L, 1);SPIN_UNLOCK(E)return result;}optint, optstring, optboolean 从 &E-L 的全局环境中取得对应键的值 。如果全局环境内未定义 。则第二个参数 opt 设为 key的默认值 。
lua_close(L);
关闭main函数内创建的 lua 虚拟机 。
skynet_start(&config);
下一节的内容 。
skynet_globalexit();
【skynet源码浏览系列从main函数开始 net源码使用教程】void skynet_globalexit(void) {pthread_key_delete(G_NODE.handle_key);}删除在 skynet_initthread 中定义的固定的线程资料。
推荐阅读
- 自慰会导致阳痿吗 阳瘘会自己恢复要多久
- 现在加速器有免费的吗?
- 做完人流自慰会引起细菌感染吗女 做完人流自慰会引起细菌感染吗
- 什么游戏可以赚人民币?
- 据调查自慰人数1/4都是青少年
- qq自动聊天机器人软件 qq群管理辅助软件
- 睾丸有什么症状 是怎样引起的 睾丸不为人知的十个难言之隐
- 灰色和蓝色装修效果图哪个好些?
- 男性健康睡眠比壮阳药更重要 男人睡眠时间长什么原因