Erlang:为什么我的进程在注销进程ID后仍在运行?

Erlang:为什么我的进程在注销进程ID后仍在运行?,erlang,server,Erlang,Server,即使我注销了sts,我生成的进程也不会停止。如何停止不使用gen_server start() -> case whereis(sts) of undefined -> PidA = spawn(dist_erlang, init,[]), register(sts, PidA), {ok,PidA}; _ -> {ok,whereis(sts)} end. stop() -> case wh

即使我注销了sts,我生成的进程也不会停止。如何停止不使用gen_server

start() ->
  case whereis(sts) of
    undefined ->
      PidA = spawn(dist_erlang, init,[]),
      register(sts, PidA),
      {ok,PidA};
    _ ->
      {ok,whereis(sts)}
  end.

stop() ->
   case whereis(sts) of
     undefined -> 
        already_stopped;
     _ ->
        unregister(sts),
        stopped,
  end.

使用“取消注册”不会停止进程。但是,停止进程会注销它。因此,不要在这里使用unregister,而是使用erlang:exit/2


综上所述,您真的应该使用OTP流程行为,如gen_server,因为它们使流程管理更加容易。对于OTP进程,您可以调用该进程并告诉它停止,这样当您收到答复时,它就已经停止了。否则,退出消息可能需要一些时间才能通过。

使用“取消注册”不会停止该过程。但是,停止进程会注销它。因此,不要在这里使用unregister,而是使用erlang:exit/2

综上所述,您真的应该使用OTP流程行为,如gen_server,因为它们使流程管理更加容易。对于OTP进程,您可以调用该进程并告诉它停止,这样当您收到答复时,它就已经停止了。否则,退出消息可能需要一些时间才能通过。

取消注册不会停止此过程。它只是删除进程id和给定原子之间的绑定

您需要记住,stop/0函数是在调用该函数的进程的上下文中运行的,而不是gen_服务器本身。实际上,与某个进程交互的几乎唯一方法就是向它发送消息。因此,您可以像这样实现停止/0功能:

%% send stop message to `sts` server
stop() ->
  gen_server:cast(sts, stop). 

%% [...]


handle_cast( OtherCastMessages, State) -> 
  %% handel other cast messages ;
  %% [...] ;

%% handle stop message
handle_cast( _Message = stop, State) ->
  {stop, 
   _Reason = normal, 
   State}. % return result that stops server


%% [...]

terminate(_Reason = normal, State) ->
   %% could do some cleanup in this callback
   ok.
所以要停止服务器,必须从一个行为函数返回特殊的元组。你可以阅读更多关于这方面的内容。当然,触发一个行为函数,您必须使用gen_server:cast或gen_server:call向您的服务器发送消息,或者只发送消息并使用handle_info进行处理。使用什么是你的决定。最后调用terminate2,不管哪个回调使用stop atom返回元组,您都可以对状态进行清理

当然,您可以在terminate回调中注销您的进程,但当进程终止时,注销将自动处理

取消注册不会停止进程。它只是删除进程id和给定原子之间的绑定

您需要记住,stop/0函数是在调用该函数的进程的上下文中运行的,而不是gen_服务器本身。实际上,与某个进程交互的几乎唯一方法就是向它发送消息。因此,您可以像这样实现停止/0功能:

%% send stop message to `sts` server
stop() ->
  gen_server:cast(sts, stop). 

%% [...]


handle_cast( OtherCastMessages, State) -> 
  %% handel other cast messages ;
  %% [...] ;

%% handle stop message
handle_cast( _Message = stop, State) ->
  {stop, 
   _Reason = normal, 
   State}. % return result that stops server


%% [...]

terminate(_Reason = normal, State) ->
   %% could do some cleanup in this callback
   ok.
所以要停止服务器,必须从一个行为函数返回特殊的元组。你可以阅读更多关于这方面的内容。当然,触发一个行为函数,您必须使用gen_server:cast或gen_server:call向您的服务器发送消息,或者只发送消息并使用handle_info进行处理。使用什么是你的决定。最后调用terminate2,不管哪个回调使用stop atom返回元组,您都可以对状态进行清理


当然,您可以在terminate回调中注销您的进程,但当进程终止时,注销将自动处理

这是学校作业,我根本不允许使用gen_服务器。这是学校作业,我根本不允许使用gen_服务器。