将lua输出发送到非stdout

ewo*_*wok 5 c lua stdout

我有运行嵌入式Lua的ac程序.截至目前,它只是一个问候世界.然而,在继续之前,我希望能够将lua输出发送到除了之外的其他地方stdout,以便我可以以某种方式操纵它.这是我的代码:

#include <stdio.h>

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

int main() {
    lua_State *luaVM = luaL_newstate();
    //char result[1024];

    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }
    luaL_openlibs(luaVM);
    luaL_dostring(luaVM, "print(\"hello world!\")");
    //Somehow put the output into result

    //printf("%s\n%s\n", result, result);

    lua_close(luaVM);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

例如,我想result在评论中看到两次打印lua代码的结果.可以这样做吗?

kik*_*ito 6

如果您的Lua代码将用于print输出内容,那么我想最简单的方法是print从Lua本身重新定义.像这样的东西:

print_stdout = print -- in case you need the old behavior

print = function(...)
  for arg,_ in ipairs({...}) do
    -- write arg to any file/stream you want here
  end
end
Run Code Online (Sandbox Code Playgroud)


And*_*ovs 5

这个答案可能会引起一些读者的批评,但是首先请看一下我为该答案专门准备的博客,并阅读为什么选择此解决方案的前言。

如所承诺的,我已经将旧的Lua 5.1输出重定向补丁上游升级到了最新版本。
可在以下位置获得补丁:5.1.55.2.1

补丁

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch
Run Code Online (Sandbox Code Playgroud)

建立

cd src  
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
Run Code Online (Sandbox Code Playgroud)

检查

nm liblua-5.x.y-redirect.a | grep printf
nm liblua-5.x.y-redirect.a | grep fputs
nm liblua-5.x.y-redirect.a | grep fwrite
Run Code Online (Sandbox Code Playgroud)

测试

在此处获取测试程序(C / C ++混合使用,对不起)。通过以下方式进行构建:

g++ -DLUA_REDIRECT -I/path/to/lua-5.2.1/src/ -L. lua-redirect-test.cpp -llua-5.2.1-redirect -ldl -o lua-redirect-test  
Run Code Online (Sandbox Code Playgroud)

输出:

===== Test 1 output =====
Lua stdout buffer:
---
hello world!

---
Lua stderr buffer:
---

---
Lua error message:
---
(null)
---
===== Test 2 output =====
Lua stdout buffer:
---

---
Lua stderr buffer:
---

---
Lua error message:
---
[string "bad_function()"]:1: attempt to call global 'bad_function' (a nil value)
---
Run Code Online (Sandbox Code Playgroud)