Erlang 为什么gen_tcp:使用badarg控制_进程()会失败?

Erlang 为什么gen_tcp:使用badarg控制_进程()会失败?,erlang,ejabberd,Erlang,Ejabberd,我对ejabberd的一个模块有问题。这是http_绑定。 但当我深入调试时,我发现在接受套接字和生成之后 hadling进程和何时重新设计进程以接收新创建进程的数据 调用gen_tcp:controlling_process()失败,原因是badarg {ok,Socket}=get_tcp:accept(ListenSocket), Opts=[{active,false},…], %这里函数返回proc_lib的结果:spawn_链接(处理程序,…) {ok,Pid}=ejabberd_

我对ejabberd的一个模块有问题。这是http_绑定。 但当我深入调试时,我发现在接受套接字和生成之后 hadling进程和何时重新设计进程以接收新创建进程的数据 调用gen_tcp:controlling_process()失败,原因是badarg

{ok,Socket}=get_tcp:accept(ListenSocket),
Opts=[{active,false},…],
%这里函数返回proc_lib的结果:spawn_链接(处理程序,…)
{ok,Pid}=ejabberd_http:start({gen_tcp,Socket},Opts),
gen_tcp:控制进程(套接字、Pid),
:{巴达格[
{erlang,port_connect,[#port,]},
{inet,tcp_控制_进程,2},
{ejabberd_套接字,开始,4},
{ejabberd_listener,accept,3},
{proc_lib,init_p,5}
]}

有什么帮助吗?

很可能是套接字或进程在调用controlling\u进程之前崩溃了


他们为什么会崩溃我不知道,您是否确保ejabberd进程正常运行?

很可能是套接字或进程在调用Control_进程之前崩溃了


他们为什么会崩溃我不知道,您是否确保ejabberd进程正常运行?

来自文档页面:“失败:如果端口不是开放端口或开放端口的注册名称,或者如果Pid不是现有的本地Pid,则返回badarg。”我认为该进程已成功创建,但可能是在控制\u进程之前()调用它已崩溃,但原因是?…您知道以前如何测试进程pid有效性吗?您可以始终执行erlang:process_info(pid)并查看返回的内容以确定进程是否正在运行。从文档页:“失败:如果端口不是开放端口或开放端口的注册名称,或者Pid不是现有的本地Pid,则返回badarg。”我认为进程已成功创建,但可能是在控制_process()调用它之前崩溃了,但原因是什么?…您知道以前如何测试进程Pid的有效性吗?您始终可以执行erlang:process_info(Pid)然后查看返回的内容,以确定进程是否正在运行。
{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}
]}