ffi動態鏈結庫的使用

2022-05-02 21:24:11 字數 2042 閱讀 1443

最進專案中使用到了socketproc通訊,但是這樣有一點不是很好,必須單獨啟動乙個程序來執行**中的shell命令,後面想在nginx+lua的環境下使用openresty中的lua-resty-shell,但是在後續閱讀原始碼說明的時候發現依賴關係過於複雜,會導致引入的openresty模組越來越堵。但是發現歸根結底是對ffi庫的呼叫,什麼是ffi庫?

說白一點:ffi動態庫就是lua語言呼叫底層c語言的一系列介面,而ffi動態庫日空了非常方便的編碼風格,來使用完成自己的功能。來看一下如何使用ffi庫。

首先make 會發現有兩個找不到的,這時候就需要你手動更改makefile中的pkg_config_path和lua的路徑,改正之後make 成功,就會看到生成了ffi.so

然後將動態庫拷貝到nginx的conf同一級目錄下的lualib路徑下,再將此路徑新增到lua的cpath中,就可以使用了,就像下面一樣:

package.cpath= "

/usr/local/nginx-1.16.0/lualib/?.so;;

"..package.cpath

local ffi = require("

ffi"

)local ffishell = ffi.load("

shelltest")

ffi.cdef

[[struct dummy{};

double sqrt(double x);

int gethostname(char *name,size_t len);

char* run(const char* cmd);

]]local dat = ffishell.run('

ls -al /tmp')

ngx.

print

(ffi.string(dat))

local int_t = ffi.typeof("

int"

)local char_arr_t = ffi.typeof("

char[?]")

local a_int =ffi.new(int_t)

local char_arr=char_arr_t(10

)local x = ffi.c.sqrt(5

)ngx.

print

(x)ffi.fill(char_arr,10)

ffi.c.gethostname(char_arr,10)

--ngx.print(char_arr)

ngx.print

(ffi.string(char_arr))

--ngx.print(char_arr[0])

ngx.say(

"call ffi.so!")

--ngx.say(ffishell.run("ls -al "))

--ffi.c.system("ls -al /usr/local")

shelltest是樓主自己使用c語言中的popen函式寫的乙個呼叫shell命令介面的動態鏈結庫
#include "

shelltest.h

"char* run(const

char*shellcmd)else if(ret == 0)else

*/char buf[1024

]; file *fp=popen(shellcmd,"r"

); fgets(buf,

sizeof

(buf),fp);

//fscanf(fp,"%s",buf);

//printf("%s",buf);

pclose(fp);

return

buf;

}

標頭檔案

#ifndef __shellcmd_h

#define __shellcmd_h#include

#include

char* run(const

char*shellcmd);

#endif

可能貼出來的**有問題,需要大家在使用的時候進行簡單的修改

動態鏈結庫使用 靜 動態鏈結庫使用總結

一 靜態庫編寫 1.首先當然是開vs然後建立乙個靜態庫工程啦 2.格式.一般有標頭檔案.h和原檔案.cpp,當然你也可以寫一在乙個cpp裡.mydll.h extends c mydll.cpp include mylib.h int sum int num1,int num2 int mult i...

使用動態鏈結庫

1.動態鏈結庫是程式執行時載入的庫,當動態鏈結庫正確安裝後,所有的程式都可以使用動態庫來執行程式。動態鏈結庫是目標檔案的集合,目標檔案在動態鏈結庫中的組織方式是按照特殊方式形成的。庫中函式和變數的位址是相對位址,不是絕對位址,其真實位址在呼叫動態庫的程式載入時形成。2.動態鏈結庫的名稱有別名 son...

使用動態鏈結庫

1.先建立乙個動態鏈結庫的工程 vs下,file new project win32 project dll t.h ifdef myapi export define myapi declspec dllexport else define myapi declspec dllimport end...