1)筆記
1)c/c++內置lua解釋器,並且啓動了第一個lua腳本
2)學習內容
(1)lua程序設計
(2)c/c++導出給lua使用
(3)c/c++調用lua
3)深入理解lua調用c函數
(1)lua只能調用int(*lua_CFunction)(lua_State* L)這種類型lua函數
(2)調用lua的標準接口
(3)lua才能調用得到
(4)字符串,註冊好lua函數,函數指針,那麼lua中就可以調用得到這種函數
(5)總歸得有函數參數、函數返回值,lua如何傳遞值給c/c++,c/c++如何把返回值丟給lua?
4)如何獲得lua傳遞過來的參數?通過lua虛擬機操作lua虛擬機的棧!
(1)lua調用綁定的C的接口的時候,首先會把要的函數的參數先push到lua棧中,我們進到這個函數裏面後,
通過lua的封裝,來讀棧的元素,就可以獲得對應的參數
(2)處理完後,再把返回值push回這個棧
5)lua棧和普通棧是不一樣的
(1)
4 -1
3 -2
2 -3
1 -4
(2)從下往上,1 2 3 4
(3)索引1表示第一個-1表示最後一個,也就是最頂上的
6)註冊c函數到lua過程
(1)name-->固定類型函數指針
7)reg_func2lua導出過程
(1)pushfunction 先壓入棧
(2)lua_setglobal 設置到全局名字name,lua即可調用
8)main.lua中,直接調用lua_debug, 這樣直接調用我們的c函數
(1)參數已經壓入到棧裏面了
luaL_checkstring(L, -1), 這樣從棧頂拿到參數, 返回數據或者NULL
(2)因此寫下 lua_debug("hello"), 那麼,從棧頂上拿到的就是 "hello"字符串,而不是NULL
(3)由於要寫入日誌,因此 file_name(哪個文件) line_num(第幾行) 不可少
我們通過lua api獲取運行時調試信息,運行時棧信息 就知道哪個文件哪一行.
9)在lua調用導出的c函數時,如: lua_debug("hello"),可以用標準的lua api 訪問棧,
得到傳遞過來的lua的參數 "hello"
10)當lua虛擬機執行出錯,執行不下去了,那麼需要殺掉進程
(1)默認是lua出錯,調用abort,殺死進程
(2)自定義panic函數,那麼就會避免調用abort,服務器不會終止
(3)有未處理的異常,將會走自定義的panic函數,我們也輸出了錯誤日誌
11)目標
(1)我們不是要開發解析任意一個腳本
(2)我們需要輕量級的,基於service開發即可。 我們不是傳統的全部lua開發,而是支持c/c++
和 lua同時開發,我們做的不會特別龐大。