2010-02-03 48 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

相关问题