Erlang VM -s argomento comportamento anomalo
Domanda
Quando inizio una funzione all'interno del guscio Erl, funziona benissimo. Quando provo a richiamare la stessa funzione con Erl ... la funzione del modulo -s, fallisce.
La riga di codice che alla fine non è:
start(Port) ->
mochiweb_http:start([{port, Port}, {loop, fun dispatch_requests/1}]).
Sono positivo che porta sia impostata correttamente. Il mio messaggio di errore è:
=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:
ho provato il debugger e mi permette di passo attraverso fino a quando sopra è dato la riga di codice. Dopo Passo che, mi dà questo rapporto incidente.
Ogni aiuto è molto apprezzato.
Soluzione
Hm, credo che dovrebbe funzionare. Sono tutti i moduli compilati con la stessa versione del compilatore? IIRC ci potrebbero essere errori strani sul livello di socket in caso contrario. A proposito, si potrebbe chiamare la funzione di punto di ingresso iniziare, che è l'impostazione predefinita per -s.
Altri suggerimenti
In alternativa si può provare l'opzione -eval
:
erl -eval 'module:start(9090).'
quando si utilizza -s, gli argomenti vengono raccolti in un elenco, in modo che il porto sarebbe in realtà essere racchiuso in un elenco. è possibile controllare entrambi i casi (elenco o int) con una funzione wrapper (come start([Port])
).
Quando si utilizza -s per eseguire le funzioni di Erlang, gli argomenti vengono messi in una lista di atomi di . Quando si utilizza run per eseguire le funzioni di Erlang, gli argomenti vengono messi in una lista di stringhe .
Se avete bisogno di un numero intero valore da trasmettere, è necessario effettuare le conversioni appropriate. Se si vuole coprire tutti i casi, qualcosa di simile potrebbe aiutare:
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}]).
Consultate la pagina man di Erl ( "Erl -man Erl") per i dettagli.