Эрланг В.М. -с аргументом неправильного поведения - PullRequest
0 голосов
/ 17 января 2010

Когда я запускаю функцию в оболочке 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 ]

1 голос
/ 25 января 2010

В качестве альтернативы вы можете попробовать вариант -eval:

erl -eval 'module:start(9090).'
1 голос
/ 17 января 2010

Хм, я думаю, что это должно работать. Все ли модули скомпилированы с одинаковой версией компилятора? IIRC могут быть странные ошибки на уровне сокета, если нет. Кстати, вы можете вызвать запуск функции точки входа, которая является значением по умолчанию для -s.

0 голосов
/ 21 января 2010

Когда вы используете -s для запуска функций Erlang, аргументы помещаются в список атомов . Когда вы используете -run для запуска функций Erlang, аргументы помещаются в список строк .

Если вам нужно передать значение integer , вам необходимо выполнить правильные преобразования. Если вы хотите охватить все случаи, может помочь что-то подобное:

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") для деталей.

0 голосов
/ 17 января 2010

при использовании -s аргументы собираются в список, поэтому порт фактически будет включен в список. Вы можете проверить оба случая (list или int) с помощью функции-оболочки (например, start([Port])).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...