C 在调用lua_resume时是否有避免阻塞的方法?

C 在调用lua_resume时是否有避免阻塞的方法?,c,lua,luajit,C,Lua,Luajit,我需要一些帮助,试图理解以下情况,因为我目前对这件事的了解不够,我不知道从哪里开始 从具有主Lua状态的C pthread,每个请求创建一个Lua协程,在堆栈上放置一个预注册的Lua函数和一些参数,并使用Lua_resume启动它。这个Lua脚本函数执行一个io.popen并调用一个C函数,该函数从io.popen获取文件*,获取相应的fd,将其设置为非阻塞,将其添加到读取事件q ueue,并执行Lua_生成。到目前为止还不错,C接手。当C调用lua_resume时,它会阻塞,直到我从fd中读取

我需要一些帮助,试图理解以下情况,因为我目前对这件事的了解不够,我不知道从哪里开始

从具有主Lua状态的C pthread,每个请求创建一个Lua协程,在堆栈上放置一个预注册的Lua函数和一些参数,并使用Lua_resume启动它。这个Lua脚本函数执行一个io.popen并调用一个C函数,该函数从io.popen获取文件*,获取相应的fd,将其设置为非阻塞,将其添加到读取事件q ueue,并执行Lua_生成。到目前为止还不错,C接手。当C调用lua_resume时,它会阻塞,直到我从fd中读取完与文件*相关的所有内容。有什么办法可以避免这种阻碍吗?如果我只想读取一个字符并立即返回C,而不关心io.popen的剩余输出,该怎么办

我在LuaJIT 2.1beta3和Lua 5.1中都试过,它们的行为都是一样的。
任何帮助都将不胜感激。

这不是很大程度上取决于C代码,而不是Lua代码吗?Lua代码没有“阻塞”的概念;无论调用什么代码,都可以执行阻止。谢谢您的回复。我的意思是说“除非我读完”,而不是“直到我读完”。如有必要,我可以编辑。基本上,如果我一直以非阻塞方式从fd读取,我可以控制在C和Lua之间来回,但如果我只想得到一个字符并调用Lua_resume,它会阻塞,直到io.popen完成它的过程。@Nicol Bolas我同意这一点,这也是我无法理解的部分原因。第一个lua_resume启动主lua函数的协程(从C),然后第二个lua_resume在从lua调用主lua函数后尝试恢复该主lua函数(从C)。这听起来可能有点混乱,让我知道我是否应该写一些代码。我想我找到了阻塞代码。在Lua脚本中,调用f=io.popen(..)的相应f:close()会阻止Lua脚本的继续,直到进程完成。如果我不显式关闭它(以避免阻塞),GC会收集它吗?@humand-管道是有限的操作系统资源,使用后应该手动关闭它们。当然,Lua可以为您做这件事,但是阻塞将发生在GC内部:-)是否将
f:close()
阻塞取决于操作系统。Lua只是调用一个C库函数。这不是很大程度上取决于C代码,而不是Lua代码吗?Lua代码没有“阻塞”的概念;无论调用什么代码,都可以执行阻止。谢谢您的回复。我的意思是说“除非我读完”,而不是“直到我读完”。如有必要,我可以编辑。基本上,如果我一直以非阻塞方式从fd读取,我可以控制在C和Lua之间来回,但如果我只想得到一个字符并调用Lua_resume,它会阻塞,直到io.popen完成它的过程。@Nicol Bolas我同意这一点,这也是我无法理解的部分原因。第一个lua_resume启动主lua函数的协程(从C),然后第二个lua_resume在从lua调用主lua函数后尝试恢复该主lua函数(从C)。这听起来可能有点混乱,让我知道我是否应该写一些代码。我想我找到了阻塞代码。在Lua脚本中,调用f=io.popen(..)的相应f:close()会阻止Lua脚本的继续,直到进程完成。如果我不显式关闭它(以避免阻塞),GC会收集它吗?@humand-管道是有限的操作系统资源,使用后应该手动关闭它们。当然,Lua可以为您做这件事,但是阻塞将发生在GC内部:-)是否将
f:close()
阻塞取决于操作系统。Lua只调用一个C库函数。