Аргумент Erlang VM -s ведет себя неправильно

StackOverflow https://stackoverflow.com/questions/2080153

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Я попробовал отладчик, и он позволяет мне выполнять все действия до тех пор, пока не будет указана строка кода выше.После того, как я передам это, он выдает мне отчет о сбое.

Любая помощь очень ценится.

Это было полезно?

Решение

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

Другие советы

Альтернативно вы можете попробовать -eval вариант:

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

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

Когда вы используете -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}]).

Обратитесь к man-странице для Эрл («erl -man erl») для получения подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top