最進專案中使用到了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.
(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.
(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...