如何在Solaris命令行中制作非阻塞管道?

我正在编写一个 lua 脚本,它可以从其他进程读取输入并进行分析。为了实现此目的,我使用 io.popen,它在 Windows 上的使用符合预期,但在 Unix(Solaris) 上,从io.popen读取会阻塞脚本,所以脚本会一直等待直到有东西出现,而不是立即返回。

据我所知,我无法在脚本内改变io.popen的功能,如果可能的话,我也不想改变C代码,因为那样一来,脚本将需要与补丁二进制文件捆绑。

那我还有什么命令行解决方案呢?

原文链接 https://stackoverflow.com/questions/564363

点赞
stackoverflow用户15124
stackoverflow用户15124

将Lua中的io.popen函数封装成一个类来方便使用

目前尚未得到任何答案,但为了记录,如果有人需要类似的解决方案,我进行了以下操作:

function my_popen(name,cmd)
    local process = {}
    process.__proc = assert(io.popen(cmd..">"..name..".tmp", 'r'))
    process.__file = assert(io.open(name..".tmp", 'r'))
    process.lines  = function(self)
        return self.__file:lines()
    end
    process.close = function(self)
        self.__proc:close()
        self.__file:close()
    end
    return process
end

proc = my_popen("somename","some command")
while true
    --进行操作
    for line in proc:lines() do
        print(line)
    end
    --进行操作
end
2009-02-19 09:31:50
stackoverflow用户67432
stackoverflow用户67432

你的问题似乎与缓冲有关。由于某种原因,管道在允许打开的程序继续写入之前,等待一些数据被读取,而这些数据似乎少于一行。你可以使用 io.popen(cmd):read"\*a" 来读取所有内容,这应该可以避免缓冲问题。然后,你可以使用 for line in string.gmatch("\[^\\n\]+") do someting\_with(line) end 将返回的字符串拆分成行。

你的解决方案在于将进程的输出转储到文件中,然后读取该文件。你可以将使用 io.popen 的方法替换为 io.execute 并且丢弃返回值(只需检查它为 0 即可)。

2009-02-19 14:33:23