2010-02-03 49 views
1

我有一個ejabberd模塊的問題。它是http_bind。 但是,當我深深地調試時,我發現接受套接字併產卵 哈希進程,並通過調用gen_tcp:controls_process()失敗與badarg爲什麼接收數據爲新創建的進程 重新分配過程?爲什麼gen_tcp:controls_process()可以通過badarg失敗?

...

{ok, Socket} = get_tcp:accept(ListenSocket), 
Opts = [{active, false}, ...], 

% here function return result of proc_lib:spawn_link(handler, ...) 
{ok, Pid} = ejabberd_http:start({gen_tcp, Socket}, Opts), 

gen_tcp:controlling_process(Socket, Pid), 

: {badarg, [ 
    {erlang, port_connect, [#Port<0.140743856>, <0.5939.4350>]}, 
    {inet, tcp_controlling_process, 2}, 
    {ejabberd_socket,start,4}, 
    {ejabberd_listener,accept,3}, 
    {proc_lib,init_p,5} 
]} 

任何幫助嗎?

回答

1

在調用controls_process之前,很有可能是套接字或進程崩潰了。

http://www.erlang.org/doc/man/erlang.html#port_connect-2

他們爲什麼會墜毀,我不知道,你有沒有做出肯定的ejabberd進程正在運行,因爲它應該?

+0

從文檔頁面:「失敗:badarg如果端口不是開放端口或開放端口的註冊名稱,或者如果Pid不是現有的本地pid。 – 2010-02-03 20:11:25

+0

我認爲過程是成功創建的,但可能在controls_process()調用它之前崩潰了,但是爲什麼?...你知道我以前如何測試過程pid有效性? – vinnitu 2010-02-04 08:20:41

+0

你總是可以做erlang:process_info(Pid)並查看返回結果以確定進程是否正在運行。 – Lukas 2010-02-04 08:25:45

相關問題