2013-04-05 40 views
2

我需要從erlang的os命令不斷顯示stdout/stderr。 在紅寶石我可以用下面的代碼實現:如何在erlang中連續顯示os命令輸出?

s1, s2 , s3, t = Open3.popen3('for %a in (1 2 3 4 5 6 7 8 9) do (echo message & sleep 2) 2>&1 ') 

s2.each do |l| 
    puts l 
end 

它會在「實時」顯示「郵件\ n郵件\ n」 - 不等待進程結束。

我試過os:cmd(..)

1> P5 = erlang:open_port({spawn, "ruby rtest.rb"}, [stderr_to_stdout, in, exit_s 
tatus, binary,stream, {line, 255}]). 
#Port<0.505> 
2> receive {P5, Data} -> io:format("Data ~p~n",[Data]) end. 
Data {data,{eol,<<>>}} 
ok 

但他們兩人的等待過程結束。

Erlang中的連續標準輸出是否可選?

編輯: 換句話說我尋找一個POPEN(C/C++; proc_open(PHP)與等)功能中的erlang

EDIT2 代碼,在Linux的工作原理(上centos6測試0.2)。感謝vinod

-module(test). 
-export([run/0]). 


run() -> 
    P5 = erlang:open_port({spawn, "sh test.sh"}, 
    [stderr_to_stdout, in, exit_status,stream, {line, 255}]), 
    loop(P5). 

loop(P) -> 
     receive{P, Data} -> 
      io:format("Data ~p~n",[Data]), 
     loop(P) 
     end. 

輸出:

10> c(test). 
{ok,test} 
11> test:run(). 
Data {data,{eol,"1"}} 
Data {data,{eol,"2"}} 
Data {data,{eol,"3"}} 
Data {data,{eol,"4"}} 
Data {data,{eol,"5"}} 
Data {data,{eol,"6"}} 
Data {data,{eol,"7"}} 
Data {data,{eol,"8"}} 
Data {data,{eol,"9"}} 
Data {data,{eol,"10"}} 
Data {exit_status,0} 

回答

4

如果我理解正確的,你要繼續在並行與操作系統命令執行程序。在Erlang中,你可以產生一個這樣的過程,你可以繼續。例如

1> spawn(fun() -> 
     P5 = erlang:open_port({spawn, "ruby rtest.rb"}, 
          [stderr_to_stdout, in, exit_status, 
           binary,stream, {line, 255}]), 
     receive {P5, Data} -> 
      io:format("Data ~p~n",[Data]) 
     end 
    end). 
<0.32.0> 
2> 5+5. 
10 
3> 

更好地寫在模塊中,以便您能更好地理解它。

+0

那不是我需要的。我需要在不等待命令結束的情況下獲得命令輸出。例如,頁面頂部的ruby代碼允許從打開的進程打印輸出行,同時進程將其打印到自己的stderr或stdout。 – rdo 2013-04-05 14:47:22

+0

上面的代碼也做同樣的事情。生成的過程在產卵過程(此處爲shell過程)繼續打印的同時打印輸出。在這裏,您正在創建另一個Erlang進程,它專門等待來自OS進程的數據並打印出來,同時產生Erlang進程繼續同時打印。 – Vinod 2013-04-05 19:01:31

+0

嘗試在Windows 7 x64上。你使用什麼操作系統? – rdo 2013-04-06 01:29:35

相關問題