手動導出c++日誌函數給lua使用

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同時開發,我們做的不會特別龐大。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章