咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 347|回复: 0

[Erlang] Erlang中执行linux命令的两种方法

[复制链接]
  • TA的每日心情
    无聊
    2019-5-27 08:20
  • 签到天数: 4 天

    [LV.2]圆转纯熟

    发表于 2020-1-29 13:30:31 | 显示全部楼层 |阅读模式
    os.cmd(Cmd)
    os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令)。返回一个Cmd命令的标准输出字符串结果。例如在linux系统中执行os:cmd("date"). 返回linux的时间。 这种比较简单,一般情况下,也满足了大部分需求。
    erlang:open_port(PortName, PortSettings)
    当os.cmd(Cmd) 满足不了你的需求的时候,就可以用强大的open_port(PortName, PortSettings) 来解决了。最简单的需求,我要执行一个linux命令,而且还需要返回退出码。os.cmd(Cmd) 就有些捉急了。也不要以为有了open_port(PortName, PortSettings) 就可以完全替代os.com(Cmd) 了。强大是需要代价的。
    %% 优点:可以返回exit status 和执行过程
    %% 缺点: 非常影响性能, open_port执行的时候,beam.smp会阻塞
    当对本身系统的性能要求比较高的时候,不建议使用erlang:open_port(PortName, PortSettings) .
    下面是一段很好用的代码,返回exit status 和执行结果。


    my_exec(Command) ->

        Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),

        Result = get_data(Port, []),

        Result.
    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 ->              % force context switch

                ok

            end,

            ExitCode =

                receive

                {Port, {exit_status, Code}} ->

                    Code

            end,

            {ExitCode, lists:flatten(Sofar)}

        end.

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2023-5-31 05:14

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表