2012-08-09 84 views
4

我有一個運行嵌入式Lua的c程序。截至目前,這只是一個你好的世界。但在繼續之前,我希望能夠將lua輸出發送到除stdout以外的其他位置,以便我可以以某種方式操縱它。這裏是我的代碼:發送lua輸出到非標準輸出

#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; 
} 

比如我想使用result,在評論中看到的,打印的Lua代碼的結果的兩倍。這可以做到嗎?

+0

我已經完成了過去。你需要修補Lua來達到這個目的。你使用什麼版本?我的補丁適用於Lua 5.1,但我也可以將它移植到5.2。 – 2012-08-09 14:57:51

+0

我正在使用5.2。這真的不可能作爲C API中的一個選項嗎? – ewok 2012-08-09 15:03:16

+0

除了完全重新編寫'stdout',我更願意避免使用 – ewok 2012-08-09 15:03:47

回答

4

這個答案可以從一些讀者批評得,但首先請看看我的blog post我已經特意準備了這個答案,並閱讀前言爲什麼我選擇了這個解決方案。

按照承諾,我已將我舊的Lua 5.1輸出重定向補丁升級到最新版本。
修補程序可在此處獲得:5.1.55.2.1

補丁

patch -p1 < ~/download/lua-5.2.1-output-redirect.patch 

構建

cd src 
make a LUA_A="liblua-5.2.1-redirect.a" SYSCFLAGS="-DLUA_USE_LINUX -DLUA_REDIRECT" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses" 

檢查

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 

測試

獲取測試程序here(C/C++ mixed,sorry)。通過構建:

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 

輸出:

===== 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) 
--- 
5

如果你的Lua代碼將使用print來輸出內容,那麼我想最簡單的方法是從Lua本身重新定義print。事情是這樣的:

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 
+0

這看起來像它沿着我要去的路線,但我需要知道如何,因爲缺乏更好的術語,將輸出從luaL_dofile()返回到char *在C.這可以這樣做嗎? – ewok 2012-08-09 15:27:50

+0

如果Lua腳本包含語法錯誤會怎麼樣?如果要獲取緩衝區中的錯誤而不是stdout/stderr,則需要修補Lua。 – 2012-08-09 15:33:42

+0

@ewok luaL_dofile()不寫入標準輸出。 「輸出」是什麼意思? – kikito 2012-08-09 16:23:12

1

Lua的I/O庫可能包括你在找什麼。 io.output功能可讓您設置默認輸出文件。查看5.2手冊中的I/O library section,看看還有什麼。

爲什麼你想重新路由輸出?你說你想以某種方式操縱它,但你是什麼意思?

+1

目標是讓輸出A)顯示在gui中,而不是控制檯和B)具有某些功能,在顯示前在C中完成計算 – ewok 2012-08-10 17:34:43