C語(yǔ)言拓展實(shí)現(xiàn)Lua sleep函數(shù)
這幾天在做一個(gè)小項(xiàng)目,其中用到了一些基本的API, 例如sleep,獲取當(dāng)前目錄等等,lua標(biāo)準(zhǔn)庫(kù)中沒(méi)有提供這些接口,雖然所第三方庫(kù)中也都有實(shí)現(xiàn),但是要用的就那么幾個(gè)函數(shù),在一個(gè)嵌入式系統(tǒng)中安裝那么多第三方庫(kù)有點(diǎn)浪費(fèi)資源,于是@勝利哥 寫(xiě)了一個(gè)socket的C實(shí)現(xiàn),然后給我用。我試著把其他幾個(gè)函數(shù)也用C實(shí)現(xiàn),首先看下怎么用C寫(xiě)lua的拓展。
C 部分
首先是根據(jù)Lua C語(yǔ)言的協(xié)議寫(xiě)好調(diào)用模塊,編譯成.so 文件,然后才可以在lua腳本中調(diào)用。 下面是在Ubuntu14.04 **系統(tǒng)中,基于lua5.1** 寫(xiě)的一個(gè)sleep實(shí)現(xiàn)。
*sleep.c 文件 *
/*學(xué)習(xí)寫(xiě)lua c拓展,對(duì)于一些簡(jiǎn)單的函數(shù)自己提供C拓展
*ubuntu 編譯 $ gcc -fPIC -shared -llua sleep.c -o orangleliu.so -I/usr/include/lua5.1 -std=gnu99
*/
#include "unistd.h"
/*這個(gè)三個(gè)是必須的頭文件*/
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
/*simple sleep*/
static int sleep_c (lua_State *L){
long secs = lua_tointeger(L, -1); /*獲取參數(shù)*/
sleep(secs);
return 0; /*返回0個(gè)值,所以為0*/
}
static const struct luaL_Reg libs[] = {
{"sleep", sleep_c},
{NULL, NULL} /*the end*/
};
int luaopen_orangleliu (lua_State *L){
/*注冊(cè)lib, 上面luaopen_名稱 跟下面注冊(cè)的名稱要一致, 還要和編譯的.so文件名一致*/
luaL_register(L, "orangleliu", libs);
return 1;
}
編譯
$ gcc -fPIC -shared -llua sleep.c -o orangleliu.so -I/usr/include/lua5.1 -std=gnu99
lua 調(diào)用
test.lua
require "orangleliu"
print(os.time())
orangleliu.sleep(1)
print(os.time())
調(diào)用結(jié)果
$ lua test.lua
1427118862
1427118863
小結(jié)
基本的模板就是這樣的,復(fù)雜一些就是多個(gè)參數(shù)和多個(gè)返回值。 如果有C基礎(chǔ),寫(xiě)起來(lái)還是挺快的,不過(guò)要是跨平臺(tái)處理起來(lái)也挺麻煩的。 大家可以在github上搜下別人寫(xiě)的lua拓展庫(kù),參考下。
相關(guān)文章
《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理
在本篇文章里小編給大家整理的是關(guān)于《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,需要的朋友們參考下。2020-02-02華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼
這篇文章主要介紹了華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)
這篇文章主要介紹了NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)的相關(guān)資料,希望通過(guò)本文大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10C++運(yùn)算符重載實(shí)例代碼詳解(調(diào)試環(huán)境 Visual Studio 2019)
這篇文章主要介紹了C++運(yùn)算符重載實(shí)例(調(diào)試環(huán)境 Visual Studio 2019),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C語(yǔ)言編程數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)詳解小白篇
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),非常適合初學(xué)數(shù)據(jù)結(jié)構(gòu)的小白,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01C++訪問(wèn)std::variant類型數(shù)據(jù)的幾種方式小結(jié)
std::variant是?C++17中引入的一個(gè)新的類模板,提供了一種存儲(chǔ)不同類型的值的方式,本文主要介紹了C++訪問(wèn)std::variant類型數(shù)據(jù)的幾種方式小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02