0

当我在 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

4 回答 4

1

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

erl -eval 'module:start(9090).'
于 2010-01-25T07:06:16.230 回答
1

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

于 2010-01-17T08:48:44.430 回答
0

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

于 2010-01-17T07:00:30.127 回答
0

当您使用 -s 运行 Erlang 函数时,参数被放入atom列表中。当你使用 -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”)的手册页。

于 2010-01-21T02:34:18.450 回答