skynet加載配置文件

看了skynet加載配置的地方,竟然發(fā)現(xiàn)好多知識(shí)點(diǎn),記錄下.

skynet的配置文件是通過(guò)命令行傳入到進(jìn)程的,這個(gè)比較明了. 仔細(xì)讀了一下這塊代碼,發(fā)現(xiàn)有不少細(xì)節(jié),而且,有些lua函數(shù)竟然很少用過(guò),下面就這塊代碼分析一下.

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();

    sigign();

    struct skynet_config config;

    struct lua_State *L = lua_newstate(skynet_lalloc, NULL);
    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");

    lua_close(L);

    skynet_start(&config);
    skynet_globalexit();
    luaS_exitshr();
    return 0;
}

加載配置文件通過(guò)luaL_loadstring,lua_pushstring,lua_pcall三個(gè)lua api來(lái)完成.

luaL_loadstring(load_config)加載一段lua字符串代碼,整理后如下:

local f = assert(io.open(...))
local code = assert(f:read('*a'))
local function getenv(name)
    return assert(os.getenv(name), 'os.getenv() failed: config')
end
code = string.gsub(code, '%$([%w_%d]+)', getenv)
f:close()
local result = {}
assert(load(code, '=(load)', 't', result))()
return result

我們注意到io.open的參數(shù)是...,其實(shí)是通過(guò)lua_pushstring(config_file)傳遞進(jìn)去的.lua_pcall就是執(zhí)行這段代碼,并有一個(gè)返回值.

執(zhí)行在上面的代碼,讀取配置文件的內(nèi)容. string.gsub()用來(lái)查找形如'XXX',一般是系統(tǒng)的環(huán)境變量,例如HOME,然后用getenv()函數(shù)執(zhí)行的結(jié)果來(lái)替換. 這一點(diǎn)有時(shí)也挺有用,比如寫(xiě)路徑時(shí)可以直接引用系統(tǒng)的變量路徑值.

再后面就是load,他的作用是把code字符串作為一個(gè)函數(shù)體,然后執(zhí)行.這樣說(shuō)還是不清楚,我們看下一個(gè)例子:

b = 100
f = load('return b')
print(f())

f就相當(dāng)于f = function() return b end,區(qū)別是如果b是個(gè)local變量,那么在load中則不可見(jiàn).

第二個(gè)參數(shù)'=(load)'在錯(cuò)誤消息和調(diào)試消息中仗阅,用于代碼塊的名字。 如果不提供此參數(shù)章钾,它默認(rèn)為字符串chunk 。 chunk 不是字符串時(shí)视搏,則為 "=(load)" 歹茶。字符串't'用于控制代碼塊是文本還是二進(jìn)制(即預(yù)編譯代碼塊)。 它可以是字符串 "b" (只能是二進(jìn)制代碼塊)穆壕, "t" (只能是文本代碼塊)死陆, 或 "bt" (可以是二進(jìn)制也可以是文本)招拙。 默認(rèn)值為 "bt"。result用來(lái)接收函數(shù)的上值. 所謂上值就是函數(shù)里的全局變量,即配置文件里的形如'thread = 8'的值,都保存在result里, 并且返回result,供下面的c環(huán)境中使用.

接下來(lái)就是將上面的result通過(guò)skynet_setenv寫(xiě)入到全局的lua虛擬機(jī)中.這樣全局虛擬機(jī)中就有了配置文件中的鍵值對(duì).skynet_start()函數(shù)有個(gè)skynet_config類型的參數(shù),他是通過(guò)optint,optstring函數(shù)從前面說(shuō)的全局lua虛擬機(jī)中獲取的. 就這樣skynet入口獲取到了配置文件中的值.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末措译,一起剝皮案震驚了整個(gè)濱河市别凤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌领虹,老刑警劉巖规哪,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異塌衰,居然都是意外死亡诉稍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)最疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杯巨,“玉大人,你說(shuō)我怎么就攤上這事努酸》” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵获诈,是天一觀的道長(zhǎng)仍源。 經(jīng)常有香客問(wèn)我,道長(zhǎng)舔涎,這世上最難降的妖魔是什么笼踩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮亡嫌,結(jié)果婚禮上嚎于,老公的妹妹穿的比我還像新娘桶至。我一直安慰自己,他們只是感情好匾旭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著圃郊,像睡著了一般价涝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上持舆,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天色瘩,我揣著相機(jī)與錄音,去河邊找鬼逸寓。 笑死居兆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竹伸。 我是一名探鬼主播泥栖,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勋篓!你這毒婦竟也來(lái)了吧享?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤譬嚣,失蹤者是張志新(化名)和其女友劉穎钢颂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拜银,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殊鞭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尼桶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片操灿。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泵督,靈堂內(nèi)的尸體忽然破棺而出牲尺,到底是詐尸還是另有隱情,我是刑警寧澤幌蚊,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布谤碳,位于F島的核電站,受9級(jí)特大地震影響溢豆,放射性物質(zhì)發(fā)生泄漏蜒简。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一漩仙、第九天 我趴在偏房一處隱蔽的房頂上張望搓茬。 院中可真熱鬧犹赖,春花似錦、人聲如沸卷仑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锡凝。三九已至粘昨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窜锯,已是汗流浹背张肾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锚扎,地道東北人吞瞪。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驾孔,于是被迫代替她去往敵國(guó)和親芍秆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容