1. 程式人生 > 其它 >在openresty中利用lua嵌入C程式

在openresty中利用lua嵌入C程式

技術標籤:Linuxlinuxluanginx

在openresty中利用lua嵌入C程式

兩個前提:

  1. 已經安裝openresty,若是沒有安裝可以前往https://blog.csdn.net/weixin_43850474/article/details/112860649檢視如何安裝
  2. 已經學會如何在lua中呼叫C函式,若是不會,可以前往https://blog.csdn.net/weixin_43850474/article/details/112860725學習

一、步驟展示

第一步:編寫C程式,假設其檔案命名為:test.c

該C程式功能很簡單就是連線兩個字串

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
   
#include <stdio.h>
#include <string.h>

int Strcat(lua_State* L)
{
    char* str1=luaL_checkstring(L,1);
	char* str2=luaL_checkstring(L,2);
	strcat(str1,str2);
	lua_pushstring(L,str1);
	return 1;                                                                              }

struct luaL_Reg A[]={{"strcat",Strcat},{NULL,NULL}};

int luaopen_test_c(lua_State* L)
{
   	luaL_newlib(L,A);
  	return 1;
}

至於為什麼如此編寫以及編寫的格式請看開頭第二個網站。

第二步:編寫lua程式,假設將其命名為test_c.lua

local _M={}

function _M.display(str1,str2)                                                           	 local m=require "test.c"     
	str=m.strcat(str1,str2)
	ngx.say("連線結果為:",str)
end

return _M

上面兩步實際上就是在lua中呼叫C函式的步驟,只不過發生了略微的變動。

第三步:將C函式編譯為動態庫

gcc -c -fPIC -o test.o test.c

gcc -shared -o test.so test.o

第四步:配置nginx.conf檔案

worker_processes 1;                                                                                                                                                                 
events {
   worker_connections 1024;

}

http {
      	lua_package_path "$prefix/lua/?.lua;;";

     	server {
                
                listen 8080 reuseport;
                location / {
                                default_type text/plain;
                                content_by_lua_block {
                                除了下面兩句之外,其餘都是固定的格式,如果想要修改只需要修改下面兩句即可
                                local t= require "test_c"     
                                t.display("hello"," world")
                      }
              }
  }
}

二、結果展示

在這裡插入圖片描述

三、注意事項(很重要)

如果網頁上出現500的錯誤,有兩種可能:要麼就是你的lua程式碼寫錯了(若是複製的上面的程式碼請忽略),要麼就是你的檔案的位置放錯了。

下面我會針對第二個問題說說如何解決:

第一步:檢視error.log日誌

tail logs/error.log

發現錯誤為:
在這裡插入圖片描述

意思是沒有在這幾個路徑下找到test.so檔案,所以這個時候我們就要將上面編譯完成的.so檔案複製到圖片中的四個路徑中的某一個,我一般是複製到第一個路徑,將.so檔案拷貝到當前目錄中。如此問題解決。