Pergunta

Quando inicio uma função dentro do shell ERL, ele funciona bem. Quando tento invocar a mesma função com a função do módulo ERL ... S, ela falha.

A linha de código que eventualmente falha é:

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

Tenho certeza de que a porta está definida corretamente. Minha mensagem de erro é:

=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:

Eu tentei o depurador e isso me permite passar até a linha de código acima ser fornecida. Depois de passar por isso, isso me dá esse relatório de acidente.

Qualquer ajuda é muito apreciada.

Foi útil?

Solução

HM, acho que isso deve funcionar. Todos os módulos são compilados com a mesma versão do compilador? IIRC, pode haver erros estranhos no nível do soquete, se não. BTW, você pode chamar sua função de ponto de entrada, que é o padrão para -s.

Outras dicas

Como alternativa, você pode tentar o -eval opção:

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

Ao usar -s, os argumentos são coletados em uma lista, para que a porta seja realmente anexada em uma lista. Você pode verificar os dois casos (lista ou int) com uma função de wrapper (como start([Port])).

Quando você usa -s para executar funções de Erlang, os argumentos são colocados em uma lista de átomos. Quando você usa -run para executar funções de Erlang, os argumentos são colocados em uma lista de cordas.

Se você precisar de um Inteiro Valor para passar, você precisará fazer as conversões adequadas. Se você quiser cobrir todos os casos, algo assim pode ajudar:

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}]).

Consulte a página do homem para erl ("Erl -Man Erl") para obter detalhes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top