【发布时间】:2015-09-28 10:15:35
【问题描述】:
我想将一个不透明的数据缓冲区从 C 传递到 Lua,而无需实际复制所有数据(因为它可能是非常大的 100 兆或 GB)。
更具体地说,我有一个如下所示的 C sn-p:
uint8_t *buffer = // points to some memory
size_t size = // size of the buffer
我的 C 程序不知道缓冲区中数据的结构。它完全没有注意到它。除了调用负责使用这些数据的 Lua 函数之外,它永远不会接触这些数据。
我的目标是将这个缓冲区传递给 Lua,然后 Lua 会解释数据的内容并基于它执行各种操作(Lua 代码知道如何根据数据的内容或大小来确定数据的结构)。此外,Lua 代码不会修改缓冲区(仅从中读取)。
以下是我理想功能的一些示例伪代码:
bool perform_action(lua_State *L, uint8_t *buffer, size_t size) {
// Pass buffer to lua
// call "process_buffer" function (written in Lua)
// get return from "process_buffer" function (a boolean)
// free(buffer);
// return the result above
}
我认为这个问题与:lua newbie : C-Lua How to pass a struct/buffer to lua from C? 有关。但是,该线程中的解决方案是:“使用 LuaJIT”,这对我来说没有任何意义。
一个潜在的解决方案正在使用:
lua_pushlstring (L, buffer, size);
但这不会复制数据吗?有没有办法用零拷贝来做到这一点(因为数据很大)?
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
为什么不简单地编写并将这个函数暴露给 Lua
read_part_of_buffer(start_offset, length, return_this_part_as_number_instead_of_string)?