C语言拓展实现Lua sleep函数

这几天在做一个小项目,其中用到了一些基本的API, 例如sleep,获取当前目录等等,lua标准库中没有提供这些接口,虽然所第三方库中也都有实现,但是要用的就那么几个函数,在一个嵌入式系统中安装那么多第三方库有点浪费资源,于是@胜利哥 写了一个socket的C实现,然后给我用。我试着把其他几个函数也用C实现,首先看下怎么用C写lua的拓展。

C 部分

首先是根据Lua C语言的协议写好调用模块,编译成.so 文件,然后才可以在lua脚本中调用。 下面是在Ubuntu14.04 **系统中,基于lua5.1** 写的一个sleep实现。

代码如下:

*sleep.c 文件 *
/*学习写lua c拓展,对于一些简单的函数自己提供C拓展
 *ubuntu 编译 $ gcc -fPIC -shared -llua sleep.c -o orangleliu.so -I/usr/include/lua5.1 -std=gnu99
 */

#include "unistd.h"

/*这个三个是必须的头文件*/
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

/*simple sleep*/
static int sleep_c (lua_State *L){
    long secs = lua_tointeger(L, -1); /*获取参数*/
    sleep(secs);
    return 0;                         /*返回0个值,所以为0*/
}

static const struct luaL_Reg libs[] = {
    {"sleep", sleep_c},
    {NULL, NULL}  /*the end*/
};

int luaopen_orangleliu (lua_State *L){
    /*注册lib, 上面luaopen_名称 跟下面注册的名称要一致, 还要和编译的.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 调用

代码如下:

test.lua
require "orangleliu"
print(os.time())
orangleliu.sleep(1)
print(os.time())

调用结果

代码如下:

$ lua test.lua
1427118862
1427118863

小结

基本的模板就是这样的,复杂一些就是多个参数和多个返回值。 如果有C基础,写起来还是挺快的,不过要是跨平台处理起来也挺麻烦的。 大家可以在github上搜下别人写的lua拓展库,参考下。

(0)

相关推荐

  • C++联合体union用法实例详解

    本文实例讲述了C++联合体union用法.分享给大家供大家参考.具体如下: 我们应该按照C中的convention去使用union,这是我这篇文章要给出的观点.虽然C++使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去做,看完这篇文章之后,我想你大概也是这么想的. C由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在union中包含struct也就是一件很自然的事情了,到了C++之后,既然普遍认为C++中的struct与class基本等价,那么union中是否可以有类成员

  • C++联合体转换成C#结构的实现方法

    本文实例主要参考MSDN:http://msdn.microsoft.com/zh-cn/library/ya9bz4ha%28v=vs.80%29.aspx 最近因为项目中遇到了C++联合体转换成C#结构的情况,查了很多资料才转换成功. 备注:对于官方这个UNION示例,我的简单理解,就是这类UNION做法,可适当代替IF ELSE 之类操作. 解决问题:如果只接收视频解码数据,而从不接收音频数据,那么是否可以直接定义结构体,并以此来获取视频数据. /// <summary> /// * @

  • C语言模块回调Lua函数的两种方法

    lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平衡稍微会多写一点代码. 今天分享学到的C模块回调Lua函数的两种方法,都是炒冷饭,大侠勿喷. 1. C保存函数对象 C模块可以通过注册表保存Lua里面的对象,等适当时候取出再调用即可. 复制代码 代码如下: static int lua_callback = LUA_REFNIL; static int setnotify(lua_State *L) {   lua_callback = luaL_ref(L, LUA_REGISTR

  • C语言中调用Lua函数实例

    记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

  • 使用C语言扩展Python程序的简单入门指引

    一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能.执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人

  • C语言创建windows窗口实例

    耐得住寂寞,禁得起诱惑,这就是程序人生 步骤: 1.在WinMain中定义各种变量 2.注册窗口类RegisterClass 3.创建窗口CreateWindow 4.显示窗口和更新窗口 复制代码 代码如下: ShowWindow (hwnd, iCmdShow) ;      UpdateWindow (hwnd) ; 5.消息循环 复制代码 代码如下: while (GetMessage (&msg, NULL, 0, 0))      {           TranslateMessag

  • C语言、C++中的union用法总结

    开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台.忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市.大家都在纠结这个问题,也希望大家和我讨论讨论.别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信.我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了).重构(后期我也会说的了)了,却忽略了那些最基础,最

  • C语言拓展实现Lua sleep函数

    这几天在做一个小项目,其中用到了一些基本的API, 例如sleep,获取当前目录等等,lua标准库中没有提供这些接口,虽然所第三方库中也都有实现,但是要用的就那么几个函数,在一个嵌入式系统中安装那么多第三方库有点浪费资源,于是@胜利哥 写了一个socket的C实现,然后给我用.我试着把其他几个函数也用C实现,首先看下怎么用C写lua的拓展. C 部分 首先是根据Lua C语言的协议写好调用模块,编译成.so 文件,然后才可以在lua脚本中调用. 下面是在Ubuntu14.04 **系统中,基于l

  • Lua中函数与面向对象编程的基础知识整理

    函数 1. 基础知识 调用函数都需要写圆括号,即使没有参数,但有一种特殊例外:函数若只有一个参数且参数是字面字符串或table构造式,则圆括号可有可无,如dofile 'a.lua',f{x=10, y=20}. Lua为面向对象式的调用提供冒号操作符的特殊语法,如o.foo(o, x)等价于o:foo(x).和Javascript类似,调用函数时提供的实参数量可以与形参数量不同,若实参多了则舍弃,不足则多余的形参初始化为nil. 1.1 多重返回值 Lua允许函数返回多个结果,函数返回如ret

  • Lua中函数的几个特别之处探究

    没想到距离上一篇基础补充已经过了1年多了,最近准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~ 0.环境 我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE开始浮出水面了,它是Cocos2d-x官方出的一款专门针对Cocos2d-x+Lua或JS的IDE,试着用了,虽然不能说很完美,但,很值得期待. 所以,本文使用的Lua编辑器就选它了,大家就随意吧~ 1.扫盲--Lua的函数 Lua要创建和调用函数都十分简单,如代码: 复制代码 代码如下: function muto

  • C语言实现进制转换函数的实例详解

    C语言实现进制转换函数的实例详解 前言: 写一个二进制,八进制,十六进制转换为十进制的函数 要求: 函数有两个参数,参数(1)是要转换为十进制的进制数,参数(2)是标示参数(1)是什么进制(2,8,16标示二进制,八进制,十六进制). 要有报错信息,比如参数是1012,但参数(2)是2,显然是进制数表示有错误. 系统表 pg_proc 存储关于函数的信息 内部函数在编译之前需要先定义在 pg_proc.h 中,src/include/catalog/pg_proc.h CATALOG(pg_pr

  • C语言去除相邻重复字符函数的实现方法

    C语言去除相邻重复字符函数的实现方法 字符去重函数 功能:去重字符串相邻重复的字符,不相邻的不用去重 参数: arg1 -- 输入字符串 arg2 -- 字符串开始位置 arg3 -- 字符串结束位置 要求: 输入参数为arg1时, 对这个字符串去重 输入参数为arg1,arg2时, 从arg2位置到字符串结束,去重 输入参数为arg1,arg2,arg3时,从arg2到arg3位置,去重 src/include/catalog/pg_proc.h DATA(insert OID = 6669

  • C语言循环结构与时间函数用法实例教程

    本文实例展示了C语言循环结构与时间函数用法,对于C语言的学习来说是非常不错的参考借鉴材料.分享给大家供大家参考之用.具体如下: 完整实例代码如下: /********************************************** ** <Beginning C 4th Edition> Notes codes ** Created by Goopand ** Compiler: gcc 4.7.0 *****************************************

  • C语言中二维数组作为函数参数来传递的三种方法

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. 例如: #include <stdio.h> void func(int n, char str[ ][5] ) { int i; for(i = 0; i < n; i++) printf("/nstr[%d] = %s/n", i, str[i]); } void main() { char* p[3]; char str[][5] = {"abc&quo

  • R语言学习笔记之lm函数详解

    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: ------------------------------------------------------------- ------------------------------------------------------------- 结果可以发现,两者的结果是一样的,并无区别,但是若改为lm(y~x-1)就能看出+1和

  • C语言 fseek(f,0,SEEK_SET)函数案例详解

    fseek(f,0,SEEK_SET); 意思是把文件指针指向文件的开头 fseek 函数名: fseek 功 能: 重定位流上的文件指针 用 法: int fseek(FILE *stream, long offset, int fromwhere); 描 述: 函数设置文件指针stream的位置.如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置.如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置. 返回值: 成功,返回0,

  • C语言多种方法实现一个函数左旋字符串中K个字符

    目录 前言 法一.将左旋1次这个动作执行k次 法二.多次逆序字符串 前言 今天看到一个有趣的笔试题:实现一个函数,可以左旋字符串中的k个字符.示例如下: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 提示:以下是本篇文章正文内容,下面案例可供参考 法一.将左旋1次这个动作执行k次 这个方法的思路我来简单介绍一下: 现有1个字符串abcd 我们将a移出来,然后bcd前会空出一个位置 将bcd向前移动一个位置,最后把a放入最后一个位置,即可完成1次左旋 那么1次完成了,对于左旋

随机推荐