Erlang VM -s参数行为不端

时间:2010-01-17 06:12:58

标签: erlang erl

当我在erl shell中启动一个函数时,它工作正常。当我尝试使用erl ... -s模块函数调用相同的函数时,它会失败。

最终失败的代码行是:

start(Port) ->
    mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).

我很肯定端口设置正确。我的错误信息是:

=CRASH REPORT==== 17-Jan-2010::00:21:09 ===
  crasher:
    initial call: mochiweb_socket_server:acceptor_loop/1
    pid: <0.65.0>
    registered_name: []
    exception exit: {error,closed}
      in function  mochiweb_socket_server:acceptor_loop/1
    ancestors: [mochiweb_http,<0.1.0>]
    messages: []
    links: []
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 377
    stack_size: 24
    reductions: 93
  neighbours:

我尝试了调试器,它让我一步一步向上,直到给出上面的代码行。在我通过之后,它给了我这个崩溃报告。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

嗯,我认为应该有用。 是否所有模块都使用相同的编译器版本编译? IIRC如果没有,可能会在套接字级别上出现奇怪的错误。 顺便说一句,你可以调用入口点函数start,它是-s的默认值。

答案 1 :(得分:1)

或者,您可以尝试-eval选项:

erl -eval 'module:start(9090).'

答案 2 :(得分:0)

使用-s时,参数会被收集到列表中,因此端口实际上会包含在列表中。您可以使用包装函数(如start([Port]))检查这两种情况(列表或整数)。

答案 3 :(得分:0)

当您使用-s运行Erlang函数时,参数将放入 atoms 列表中。当您使用-run运行Erlang函数时,参数将被放入字符串列表中。

如果您需要传递整数值,则需要进行正确的转换。如果你想要涵盖所有案例,这样的事情可能有所帮助:

start([Port]) when is_atom(Port) ->
    start([atom_to_list(Port)]);
start([Port]) when is_list(Port) ->
    start(list_to_integer(Port));
start(Port) when is_integer(Port) ->
    mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).

有关详细信息,请参阅 erl (“erl -man erl”)的手册页。