0

erlシェル内で関数を起動すると、正常に動作します。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

うーん、それはうまくいくはずだと思います。すべてのモジュールが同じコンパイラバージョンでコンパイルされていますか?IIRCでない場合、ソケットレベルで奇妙なエラーが発生する可能性があります。ところで、-sのデフォルトであるエントリポイント関数startを呼び出すことができます。

于 2010-01-17T08:48:44.430 に答える
1

-evalまたは、次のオプションを試すこともできます。

erl -eval 'module:start(9090).'
于 2010-01-25T07:06:16.230 に答える
0

-sを使用してErlang関数を実行すると、引数がアトムのリストに入れられます。-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 に答える
0

-sを使用すると、引数がリストに収集されるため、ポートは実際にはリストで囲まれます。ラッパー関数(のようなstart([Port]))を使用して、両方のケース(listまたはint)をチェックできます。

于 2010-01-17T07:00:30.127 に答える