problems starting two os:cmd's

Nico Weling <>
Wed Oct 10 13:39:37 CEST 2001


Hi Ulf,

I've built it in and it's working perfectly.

Thank you very much.

Best regards,

Nico.

Ulf Wiger wrote:
> 
> In OTP R6, os:cmd/1 is serialized using a gen_server.
> This was originally done because open_port() relied on fork(),
> which could cause huge problems in very large BEAM-processes.
> 
> Nowadays (since well before OTP R6), open_port() uses vfork(),
> which doesn't automatically map the same amount of memory as the
> host process. This means that you can easily and safely write
> your own os_cmd/1, e.g. like this:
> 
> os_cmd(Cmd) ->
>     Command = binary_to_list(
>                 list_to_binary(["sh -c '", Cmd,
>                                 "' 2>&1"])),
>     Port = open_port({spawn, Command}, [stream, eof]),
>     get_data(Port, []).
> 
> get_data(Port, Sofar) ->
>     receive
>         {Port, {data, Bytes}} ->
>             get_data(Port, Sofar ++ Bytes);
>         {Port, eof} ->
>             Port ! {self(), close},
>             receive
>                 {Port, closed} ->
>                     true
>             end,
>             receive
>                 {'EXIT', Port, _} ->
>                     ok
>             after 1 ->
>                     ok
>             end,
>             Sofar;
>         {'EXIT', Port, _} ->
>             Sofar
>     after 120000 ->
>             exit(timeout)
>     end.
> 
> On Wed, 10 Oct 2001, Nico Weling wrote:
> 
> >Hi all,
> >
> >I have problems starting an os:cmd in two different processes.
> >
> >Process 1:
> >   ...
> >   ScreenOutput = os:cmd("sendfax -l /dev/mobile0" ++
>                           "  " ++ BNumber ++ "  " ++
>                           Filename"),
> >   ...
> >
> >Process 2:
> >   ...
> >   ScreenOutput = os:cmd("mgetty -s 115200 /dev/mobile1"),
> >   ...
> >
> >If the 1st os:cmd is running the 2nd os:cmd("mg....") will
> >start it's execution if the 1st os:cmd is finished. (both
> >os:cmd's are running in different erlang processes on the same
> >node)
> >
> >If I start the os:cmd's in the background:
> >
> >       os:cmd("sendfax -l /dev/mobile0" ++ "  " ++
>                BNumber ++ "  " ++ Filename" ++ "&"),
> >       os:cmd("mgetty -s 115200 /dev/mobile1 &"),
> >
> >it works fine.
> >If I start the os:cmd's in two different Erlang-shells is also
> >works fine.
> >
> >
> >Can somebody tell me what happens here and how I can solve this
> >problem. I am using Erlang R6. (I need to stick to this
> >release)
> >
> >
> >Thanks a lot,
> >
> >best regards Nico.
> >
> 
> --
> Ulf Wiger                                    tfn: +46  8 719 81 95
> Senior System Architect                      mob: +46 70 519 81 95
> Strategic Product & System Management    ATM Multiservice Networks
> Data Backbone & Optical Services Division      Ericsson Telecom AB

-- 
Nico Weling
Software Designer
Ericsson Eurolab Deutschland GmbH
Verification Tool Design

Tel: +49 2407 575 5217
Fax: +49 2407 575 651
Dect:+49 2407 575 89339



More information about the erlang-questions mailing list