【问题标题】:Pass ZMQ context to embedded Lua from C将 ZMQ 上下文从 C 传递给嵌入式 Lua
【发布时间】:2014-07-27 02:55:31
【问题描述】:

在我的 C 应用程序中,我有一个 ZMQ 上下文,我想与所有 Lua 状态共享它。我使用 Lua 5.2 版和 ZMQ 3.2 版。

我想为 Lua 使用已经可用的绑定,例如 lzmq。

例如:

// create ZMQ context
void *ctx = zmq_ctx_new();
...
// create Lua State
lua_State *L = luaL_newstate();
...
// push the context or something
lua_setglobal(L, "MY_ZMQ_CONTEXT");

然后能够以某种方式在 Lua 中使用该 ZMQ 上下文(使用 lzmq 的示例):

local zmq = require "lzmq"
require "utils"

print_version(zmq)

local ctx = MY_ZMQ_CONTEXT -- ???

local skt = ctx:socket{zmq.REQ,
    linger = 0, rcvtimeo = 1000;
    connect = "inproc://hello";
}

skt:send("hello from cli")
print_msg("recv: ",skt:recv())

skt:close()

我该怎么做这样的事情?使用 lzmq 或任何其他 ZMQ Lua 绑定?

【问题讨论】:

    标签: c lua zeromq


    【解决方案1】:

    您可以设置 lightuserda 并使用 init_ctx 函数。

    lua_pushlightuserdata(L, ctx);
    lua_setglobal(L, "MY_ZMQ_CONTEXT");
    
    local zmq = require "lzmq"
    local ctx = zmq.init_ctx(MY_ZMQ_CONTEXT)
    

    在这种情况下,您不能从 Lua 关闭上下文。 我有想法在下一个版本中添加此功能。

    lzmq 也有 C 函数LUAZMQ_EXPORT int luazmq_context (lua_State *L, void *ctx, unsigned char own)。 你可以像这样包装contex。

    luazmq_contex(L, ctx, 0);
    // or if you want hase ability to destroy contex from Lua
    // luazmq_contex(L, ctx, 1);
    
    // MY_ZMQ_CONTEXT is lzmq context
    lua_setglobal(L, "MY_ZMQ_CONTEXT");
    

    【讨论】:

    • 在调试了我的代码一段时间后,我得出的结论是上面给了我一个分段错误。我的测试 sn-p:pastebin.com/2hh9u4g5,这是一个回溯:pastebin.com/PFdxbUhv。请注意“./lzmq.so”是从 github 上的 master 分支编译的,并在 Lua 中创建一个上下文并使用它。我做错了吗?
    • 我刚刚在我的 Windows 系统上运行了这个测试,它可以工作。 init_ctx 也在 lzmq.lthread 模块中使用,并且还在 Travis 的几个模块中进行了测试。可能是您将应用程序和 lzmq 链接到不同版本的 libzmq。从 libzmq 代码中引发错误。
    • 对不起。我会再检查一遍。
    • 我应该提到这一点,我正在开发 Debian Wheezy (GNU/Linux)。我只安装了 libzmq3-dev,所以在我编译我的应用程序和 lzmq github master (libzmq3-dev:amd64 3.2.3) 时应该没有版本冲突。我将在 Windows 和 gnu/linux 的虚拟机中做一些进一步的测试。编辑:libzmq3-dev 可从 wheezy-backports 获得。
    • 我忘了。 init_ctx 接收指向不在原始 zmq 上下文中的 lzmq 上下文的指针。我想我可以解决它。只做几个测试。代码是github.com/moteus/lzmq/blob/master/src/zcontext.c#L98
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多