如何从Solaris中的命令行创建非阻塞管道?

时间:2009-02-19 08:08:14

标签: unix lua pipe nonblocking

我正在尝试编写一个lua脚本,用于读取其他进程的输入并对其进行分析。为此我使用io.popen并且它在Windows中按预期工作,但在Unix(Solaris)上读取io.popen块,因此脚本只是等到那里,直到出现某些东西而不是立即返回...

据我所知,我无法从脚本中更改io.popen的功能,如果可能,我宁愿不必更改C代码,因为那时脚本将需要被绑定用修补后的二进制文件。

这是否让我得到任何命令行解决方案?

2 个答案:

答案 0 :(得分:1)

好的到目前为止没有答案,但对于子孙后代,如果有人需要类似的解决方案我或多或少做了以下

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
    --do stuf
    for line in proc:lines() do
        print(line)
    end
    --do stuf
end

答案 1 :(得分:1)

您的问题似乎与缓冲有关。由于某种原因,管道在允许打开的程序向其写入更多内容之前等待读取一些数据,并且它似乎小于一行。你可以做的是使用io.popen(cmd):读“* a”来读取所有内容。这应该避免缓冲问题。然后你可以将返回的字符串拆分为string.gmatch中的for行(“[^ \ n] +”)do someting_with(line)end。

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