【发布时间】:2015-05-26 17:10:14
【问题描述】:
在用 C++ 编写的嵌入式多线程程序中有许多 Lua 会话(每个会话由其自己的 lua_State 表示)。每个 Lua 会话都有一个由 C++ 对象表示的专用“控制台”。此“控制台”旨在提供特定于会话的 stdin/stdout/stderr 流。
向 Lua 会话提供这样一个“控制台”的正确方法是什么?
将标准流重定向到/来自这样的控制台的正确方法是什么?
【问题讨论】:
标签: multithreading lua
在用 C++ 编写的嵌入式多线程程序中有许多 Lua 会话(每个会话由其自己的 lua_State 表示)。每个 Lua 会话都有一个由 C++ 对象表示的专用“控制台”。此“控制台”旨在提供特定于会话的 stdin/stdout/stderr 流。
向 Lua 会话提供这样一个“控制台”的正确方法是什么?
将标准流重定向到/来自这样的控制台的正确方法是什么?
【问题讨论】:
标签: multithreading lua
您可以将userdata 插入io.stdin/stdout/stderr 使用
lua_getglobal(L, "io");
lua_pushlightuserdata(L, …); // or whatever value you want here
lua_setfield(L, 0, "stdin");
// rinse, repeat for stdout and stderr
【讨论】:
FILE 结构兼容,则建议的解决方案有效。如果不是,那么可能需要在 Lua 深处进行进一步的更改,不是吗?此外,还需要使用print 函数做一些事情,目前使用lua_writestring 和lua_writeline 函数实现,而lua_State 不可用。
read() 和write() 操作(您可以使用元表来实现)。请注意,这甚至在 lua 本身中也是可能的——没有什么能阻止你覆盖 io.stdin。当您使用它时,您可以覆盖 _G["print"](是的,忘记了那个)。