lua與c語言互相調用
lua和c語言之間的互調大量出現在lua-nginx-module中,這裡給出《lua程式設計》第24-27章的一些測試程式碼。
#include <stdio.h> #include <string.h> #include <math.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> #include <stdarg.h> #include <stdlib.h> #define MAX_COLOR 255 static void stackDump(lua_State *L); static int l_split(lua_State *L) { const char *s = luaL_checkstring(L, 1); const char *sep = luaL_checkstring(L, 2); const char *e; int i = 1; lua_newtable(L); while ((e = strchr(s, *sep)) != NULL) { lua_pushlstring(L, s, e-s); lua_rawseti(L, -2, i ++); s = e + 1; } lua_pushstring(L, s); lua_rawseti(L, -2, i); return 1; } int l_map(lua_State *L) { int i, n; luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 2, LUA_TFUNCTION); n = lua_objlen(L, 1); for (i = 1; i <= n; i ++) { //stackDump(L); //printf("=====1=====\n"); lua_pushvalue(L, 2); //stackDump(L); //printf("=====2=====\n"); lua_rawgeti(L, 1, i); //stackDump(L); //printf("=====3=====\n"); lua_call(L, 1, 1); //stackDump(L); //printf("=====4=====\n"); lua_rawseti(L, 1, i); //stackDump(L); //printf("=====5=====\n"); } return 0; } // 通过Lua调用的c函数,通过打印栈说明每个函数有独立的栈 // 将c函数注册到lua中,从而被lua调用。 static int l_sin(lua_State *L) { double d = lua_tonumber(L, 1); lua_pushnumber(L, sin(d)); // stackDump(L); // printf("====l_sin===\n"); return 1; } // c 调用lua 函数 // 从Lua中得到函数,在c语言中传入参数。 double f(lua_State *L,double x, double y) { double z; lua_getglobal(L, "f"); lua_pushnumber(L, x); lua_pushnumber(L, y); // table function 1.1 2.2 说明c语言调用Lua会共享相同的栈. // stackDump(L); // printf("=====f=====\n"); if (lua_pcall(L, 2, 1, 0) != 0) printf("call f error\n"); if (!lua_isnumber(L, -1)) printf("function f must return a number\n"); z = lua_tonumber(L, -1); lua_pop(L, 1); return z; } int getfield(lua_State *L, const char *key) { int result; // stackDump(L); // printf("==1==\n"); lua_getfield(L, -1, key); // stackDump(L); // printf("==2==\n"); if (!lua_isnumber(L, -1)) printf("invalid component\n"); result = lua_tonumber(L, -1); lua_pop(L, 1); // stackDump(L); // printf("==4==\n"); return result; } static void stackDump(lua_State *L) { int i; int top = lua_gettop(L); for (i = 1; i <= top; ++ i) { int t = lua_type(L, i); switch(t) { case LUA_TSTRING: printf("'%s'", lua_tostring(L, i)); break; case LUA_TBOOLEAN: printf(lua_toboolean(L, i) ? "true" : "false"); break; case LUA_TNUMBER: printf("%g", lua_tonumber(L, i)); break; default: printf("%s", lua_typename(L, t)); break; } printf(" "); } printf("\n"); } void load(lua_State *L, const char *fname, int *w, int *h) { if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0)) printf("cannot run config.file\n"); /*lua_getglobal(L, "height"); lua_getglobal(L, "width"); if (!lua_isnumber(L, -2)) printf("width should be a number\n"); if (!lua_isnumber(L, -1)) printf("height should be a number\n"); *w = lua_tointeger(L, -2); *h = lua_tointeger(L, -1);*/ lua_getglobal(L, "table"); if (!lua_istable(L, -1)) printf("background should be table\n"); printf("%f\n", f(L, 1.1, 2.2)); float red = getfield(L, "r"); float green = getfield(L, "g"); float blue = getfield(L, "b"); printf("%f, %f, %f\n", red, green, blue); } // lua 调用c代码可以模仿这里的格式 const char* testfunc = "t = mysplit(\"hi, hello\", \",\"); print(t[1], t[2])"; int main(void) { char buff[256]; int error; lua_State *L = luaL_newstate(); luaL_openlibs(L); int w, h; // load(L, "test.lua", &w, &h); lua_pushcfunction(L, l_sin); lua_setglobal(L, "mysin"); lua_pushcfunction(L, l_map); lua_setglobal(L, "mymap"); lua_pushcfunction(L, l_split); lua_setglobal(L, "mysplit"); if (luaL_dostring(L, testfunc)) fprintf(stderr, "%s", lua_tostring(L, -1)); /* while (fgets(buff, sizeof(buff), stdin) != NULL) { error = luaL_loadbuffer(L, buff, strlen(buff), "line"); stackDump(L); error = error || lua_pcall(L, 0, 0, 0); stackDump(L); } if (error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1); }*/ lua_close(L); return 0; }
test.lua
BULE = {r = 0, g = 0, b = 1} table = {["r"] = 10, ["g"] = 23, ["b"] = 33} function f(x, y) return x + y end
編譯:gcc test.c -I/usr/local/include/luajit-2.0 -llua-5.1 -lm
以上就介紹了lua與c語言互相調用,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Nginx安裝配置Lua支援預設情況下Nginx不支援Lua模組,需要安裝LuaJIT解釋器,並且重新編譯Nginx,或者可使用國人開發的openrestry需要的模組:LuaJIT,Ngx_devel和lua-nginx-module1.環境準備[root @nginx_lua~]#yuminstall-ygccgcc-c++makepcre-develzlib-developenssl-devel2.下載最新的luajit和ngx_devel_kit以及lua-nginx-module解壓[r

實作想法直接在nginx做配置黑名單,透過編寫邏輯塊實現;在服務端(Java)中編寫過濾器,在過濾器中統一攔截;在服務端(Java)中編寫攔截器,在攔截器中統一攔截;這裡列舉了3種實現的思路,至於實現方案,可能還有更多,但是我們想想,在nginx中編寫邏輯塊貌似不是很多人擅長的;在代碼層面做不是不可以,而是這樣一來,在涉及高並發的業務高峰期,這必然會對後端服務造成較大的壓力,那麼還有沒有其他更好的處理辦法呢?這就是要說的lua,即nginx作為網關仍然作為代理伺服器,由於nginx可以整合lu

Vue.js與Lua語言的融合,編寫輕量級的嵌入式應用在現代開發中,前端框架Vue.js和腳本語言Lua都各自有著廣泛的應用。 Vue.js是一款用於建立使用者介面的漸進式框架,而Lua則是一種輕量級的腳本語言,經常用於嵌入式應用和遊戲開發。本文將介紹如何將Vue.js與Lua語言進行融合,用於編寫輕量級的嵌入式應用,並提供程式碼範例。首先,我們需要安裝Vue.j

當我們在使用 PHP 編寫網頁時,有時我們需要在目前 PHP 檔案中包含其他 PHP 檔案中的程式碼。這時,就可以使用 include 或 include_once 函數來實作檔案包含。那麼,include 和 include_once 到底有什麼差別呢?

Vue.js與Lua語言的融合,建構遊戲開發的前端引擎的最佳實踐和經驗分享引言:隨著遊戲開發的不斷發展,遊戲前端引擎的選擇成為了一個重要的決策。在這些選擇中,Vue.js框架和Lua語言都成為了眾多開發者的關注點。 Vue.js作為一款受歡迎的前端框架具有豐富的生態系統和便捷的開發方式,而Lua語言則因其輕量級和高效性能在遊戲開發中得到廣泛應用。本文將探討如何將

一、安裝LUAMac上安裝LUA很簡單,直接使用brew相關指令;brewinstalllua使用lua-v指令可以看到lua已經安裝完畢。 1)簡單使用創建一個test.lua文件,內容為:執行命令:luatest.lua輸出為:二、lua語法簡介Lua提供了互動式程式設計和腳本程式設計:互動式程式設計:直接在命令列中輸入語法,可以立即執行並查看到執行效果。腳本是程式設計:編寫腳本文件,然後再執行。 1.註解lua提供兩種註解方式:單行註解和多行註解1)單行註解使用兩個減號;--2)多行註解--[[多行註解多行

透過前面idaPro調試或hook,我們可以取得到xxtea解密key,對於sign我們可以直接開啟原始檔:可以看到sign值:byds。所以,我們可以同過xxtea解密工具(可從GitHub上下源碼自己編譯)試著解密:以index.luac為例,我們看index.luac解密前後變化:我們看到經過xxtea解密後的lua腳本仍然不是明文!我們之前根據cocos2d框架源碼及大神apk反編結果確定就是用的xxtea加密,而且app的lua腳本也有簽名值,這也印證了就是xxtea加密方式,但是我們

【實作過程】一、問題分析如果set指令設定上,但是在設定失效時間時因網路抖動等原因導致沒有設定成功,這時就會出現死計數器(類似死鎖);二、解決方案Redis+Lua是一個很好的解決方案,使用腳本使得set命令和expire命令一同達到Redis被執行且不會被幹擾,在很大程度上保證了原子操作;為什麼說是很大程度上保證原子操作而不是完全保證?因為在Redis內部執行的時候出問題也有可能出現問題不過概率非常小;即使針對小概率事件也有相應的解決方案,例如解決死鎖一個思路值得參考:防止死鎖會將鎖的值存成
