• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > Redis源码学习-Lua脚本,redis源码-lua

Redis源码学习-Lua脚本,redis源码-lua

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含Redis源码学习-Lua脚本,redis源码-lua等服务器相关知识,网友希望可以进行参考

Redis源码学习-Lua脚本,redis源码-lua


Redis源码学习-Lua脚本

1.Sublime Text配置

我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考《Sublime Text 3下C/C++开发环境搭建》。

要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会添加到这里。但是,编译时却无法链接到头文件对应的动态链接库。此时,还需要添加一个链接选项lua5.1,修改后的完整Build System配置文件如下:

{
    "path": "D:\\cygwin64\\bin",
    "cmd": ["gcc", "-I", "D:\\cygwin64\\usr\\include", "${file}", "-o", "${file_path}/${file_base_name}", "-lm", "-llua5.1", "-Wall", "&", "start", "${file_path}/${file_base_name}.exe"],
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",
    "shell": true,
    "variants":
    [
       {
            "name": "Run::Cygwin",
            "cmd": [ "start", "${file_path}/${file_base_name}.exe"]
       }
    ]
}

2.Lua基础

2.1 执行脚本

首先创建一个最简单的helloworld脚本hello.lua:

print("helloworld!")

下面详细解释一下从C代码中如何执行Lua脚本文件。不管是如何执行,Lua脚本的执行过程都分为以下五步。以下面一段代码框架适用于后面所有示例程序:

  • 初始化解释器:lua_open是一个宏定义,等同于luaL_newstate()。创建出的lua_state也暗示了,Lua解释器不使用C全局变量,而是将所有状态都保存到lua_state这个数据结构中。
  • 加载类库:luaL_openLibs()加载常用类库,如core、table、string、math等等。
  • 加载并编译代码/脚本文件:通常由luaL_loadfile()或luaL_loadbuffer()来完成,注意这只会将Lua代码编译好,并不会真正执行。下面例子中lua_dofile等同于luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0),两步合并为一步了。
  • 执行代码/脚本文件:由lua_pcall()完成,会根据当前栈上的函数名、参数执行。当错误时处理方式与上一步加载雷同,都是打印异常日志,然后从栈上弹出错误处理器,最后直接返回或退出。
  • 清理释放:lua_close()清理释放解释器占用的资源。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

void execute_from_script(char *filename);

int main(int argc, char const *argv[])
{
    execute_from_script("hello.lua");
    return 0;
}

/**
 * Execute from Lua script.
 * @param filename  script file name
 */
void execute_from_script(char *filename) 
{
    /* Lua interpreter */
    lua_State *lua = lua_open();

    /* Open Lua standard lib: io, string... */
    luaL_openlibs(lua);

    /* Execute code in script */
    if (luaL_dofile(lua, filename)) {
        fprintf(stderr, "Error when executing script: %s, %s\n", 
                    filename, lua_tostring(lua, -1));
        /* Remove error handler */
        lua_pop(lua, 1);
        return;
    }

    /* Release all resource used */
    lua_close(lua);
}

2.2 执行代码

为了简化后面的示例代码,对错误处理统一封装成bail()函数:

void bail(lua_State *lua, char *msg, char *arg) 
{
    fprintf(stderr, "%s %s: %s\n", msg, arg, lua_tostring(lua, -1));
    exit(-1);
}

这一次我们不单独创建一个Lua脚本文件,而是将Lua代码嵌入到C代码中直接执行!

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

void execute_from_code(char *code);

int main(int argc, char const *argv[])
{
    execute_from_code("print(\"hello world!!!\")");
    return 0;
}

/**
 * Execute Lua command directly.
 * @param code  Lua command
 */
void execute_from_code(char *code)
{
    lua_State *lua = lua_open();
    luaL_openlibs(lua);

    // Load & compile command and execute immediately
    if (luaL_loadbuffer(lua, code, strlen(code), "line") 
            || lua_pcall(lua, 0, 0, 0))
        bail(lua, "Error when executing code", code);

    lua_close(lua);

  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Redis源码学习-Lua脚本,redis源码-lua

相关文章

  • RPC原理,rpc
  • ganglia安装教程,ganglia教程
  • myeclipse2013 建的web项目没有web.xml,myeclipse中web.xml
  • Elasticsearch之Nested Query,elasticsearch
  • 安装openstack 时 遇见的一些问题及解决方法!,openstack一些问题
  • Mirantis 创建的Control, Compute, 节点无法从Windows机器ssh,mirantiscompute
  • 配置KVM虚拟机的网络,Bridge和Nat方式,kvmnat
  • Twitter 新一代流处理利器——Heron 论文笔记之Storm Limitations,
  • Hadoop学习笔记0005——centos下运行Hadoop实例,centoshadoop
  • 在Ubuntu 14.04安装和使用Docker,14.04docker

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • solr实战-(一),solr实战
    • 关于Oozie的input-events和done-flag,oozieinput-events
    • Hadoop学习---第三篇Hadoop的第一个Mapreduce程序,hadoopmapreduce
    • 2015.6.8,2015年6月8日
    • 学习札记:CISCO云计算,札记cisco云计算
    • 关于Openstack的浅层次认知,openstack认知
    • 【Spark1.3官方翻译】Spark快速入门,spark1.3spark
    • hive 报错/tmp/hive on HDFS should be writable. Current permissions are: rwx--x--x,hdfswritable
    • Memo Mirantis Fuel 6.1的Internet连接,mirantisfuel
    • 【Spark】Spark的Standalone模式安装部署,sparkstandalone

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有