Аргумент Erlang VM -s ведет себя неправильно
Вопрос
Когда я запускаю функцию в оболочке 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») для получения подробной информации.