1

给定一个函数:

%% @doc Retrieves client's state.
-spec(state(pid()) -> atom()).
state(Pid) when is_pid(Pid) ->
  case process_info(Pid) of
    undefined ->
      undefined;
    _Else ->
      Pid ! {state, self()},
      receive
        {state, State} ->
          State
      after
        1000 ->
          undefined
      end
  end.

对于死掉的 pid 和活着的客户端,它可以按预期工作:

> client:state(A).
undefined
> client:state(Pid).
online

但是由于某种原因,如果进程 Pid 在 1 秒内没有回复他的状态,则返回 Pid:

> client:state(self()).
<0.172.0>

我期待那里有“未定义”的原子。如何修复此代码?

4

1 回答 1

4

发生这种情况是因为您正在接收您发送的消息。您的函数在 shell 进程上运行并向自身发送{state, self()}消息。发送消息后,它立即接收消息并且函数以 结束State,即self()您发送的 pid。

我希望我没有太混乱。

于 2013-05-08T19:47:59.393 回答