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

これは、送信したメッセージを受信して​​いるためです。関数はシェル プロセスで実行されており、それ自体に{state, self()}メッセージを送信します。メッセージを送信した直後にメッセージを受信し、関数は送信Stateしたself()pid で終了します。

あまり混乱していないことを願っています。

于 2013-05-08T19:47:59.393 に答える