2009-02-19 68 views
0

我想寫一個lua腳本,從其他進程讀取輸入並分析它。爲此,我使用io.popen,它在Windows中按預期工作,但在Unix(Solaris)上從io.popen塊中讀取,因此腳本只是等待,直到出現某種情況而不立即返回...如何從Solaris的命令行製作非阻塞管道?

據我所知,我不能在腳本中更改io.popen的功能,並且如果可能的話,我寧願不必更改C代碼,因爲那麼腳本將需要綁定修補的二進制文件。

這是否讓我有任何命令行解決方案?

回答

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

您的問題似乎與緩衝。出於某種原因,管道在等待一些數據被讀取之前,它允許打開的程序寫入更多,並且它似乎不足一行。你可以做的是使用io.popen(cmd):讀取「* a」來讀取所有內容。這應該避免緩衝問題。然後你可以用string.gmatch(「[^ \ n] +」)中的line來分割返回的字符串,做someting_with(line)end。

您的解決方案是將流程的輸出轉儲到文件並讀取該文件。您可以使用io.execute替換您的使用或io.popen,並放棄返回值(只需檢查它是否爲0)。