如何在erlang中连续显示os命令输出?

时间:2013-04-05 10:04:53

标签: operating-system erlang

我需要在erlang中连续显示os命令中的stdout / stderr。 在ruby中,我可以使用以下代码实现它:

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

它会在'实时'中显示'message \ n message \ 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中连续读取stdout是否可选?

修改 换句话说,我在erlang中寻找popen(c / c ++; proc_open(php)等)函数

EDIT2 代码,适用于linux(在centos6.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}

1 个答案:

答案 0 :(得分:5)

如果我理解正确,您希望继续与os命令同时执行您的程序。在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>

最好写一个模块,以便你能更好地理解它。