我想寫一個lua腳本,從其他進程讀取輸入並分析它。爲此,我使用io.popen,它在Windows中按預期工作,但在Unix(Solaris)上從io.popen塊中讀取,因此腳本只是等待,直到出現某種情況而不立即返回...如何從Solaris的命令行製作非阻塞管道?
據我所知,我不能在腳本中更改io.popen的功能,並且如果可能的話,我寧願不必更改C代碼,因爲那麼腳本將需要綁定修補的二進制文件。
這是否讓我有任何命令行解決方案?
我想寫一個lua腳本,從其他進程讀取輸入並分析它。爲此,我使用io.popen,它在Windows中按預期工作,但在Unix(Solaris)上從io.popen塊中讀取,因此腳本只是等待,直到出現某種情況而不立即返回...如何從Solaris的命令行製作非阻塞管道?
據我所知,我不能在腳本中更改io.popen的功能,並且如果可能的話,我寧願不必更改C代碼,因爲那麼腳本將需要綁定修補的二進制文件。
這是否讓我有任何命令行解決方案?
好沒有得到迴應,到目前爲止,但留給後人,如果有人需要一個類似的解決方案我做了以下或多或少
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
您的問題似乎與緩衝。出於某種原因,管道在等待一些數據被讀取之前,它允許打開的程序寫入更多,並且它似乎不足一行。你可以做的是使用io.popen(cmd):讀取「* a」來讀取所有內容。這應該避免緩衝問題。然後你可以用string.gmatch(「[^ \ n] +」)中的line來分割返回的字符串,做someting_with(line)end。
您的解決方案是將流程的輸出轉儲到文件並讀取該文件。您可以使用io.execute替換您的使用或io.popen,並放棄返回值(只需檢查它是否爲0)。