gen_server:啥是`start_monitor/4`中的`Mon`?

Posted

技术标签:

【中文标题】gen_server:啥是`start_monitor/4`中的`Mon`?【英文标题】:gen_server: what is `Mon` in `start_monitor/4`?gen_server:什么是`start_monitor/4`中的`Mon`? 【发布时间】:2021-11-06 19:36:22 【问题描述】:

OTP 文档说gen_server:start_monitor/4 的签名是:


start_monitor(ServerName, Module, Args, Options) -> Result
OTP 23.0
Types
ServerName = local,Name | global,GlobalName
  | via,Module,ViaName
 Name = atom()
 GlobalName = ViaName = term()
Module = atom()
Args = term()
Options = [Option]
 Option = debug,Dbgs | timeout,Time | hibernate_after,HibernateAfterTimeout | spawn_opt,SOpts
  Dbgs = [Dbg]
   Dbg = trace | log | statistics | log_to_file,FileName | install,Func,FuncState
  SOpts = [term()]
Result = ok,Pid,Mon | ignore | error,Error
 Pid = pid()
 Error = already_started,Pid | term()

Mon 是什么?文档只是说:

“Mon 是对设置监控服务器的监控器的引用”

所以现在我知道Mon 是一个监视器并且它正在监视,但它的类型是什么?

阅读erlang.erl,我发现:

-type registered_name() :: atom().
-type registered_process_identifier() :: registered_name() | registered_name(), node().
-type monitor_process_identifier() :: pid() | registered_process_identifier().

Monpid() | atom() | atom(), node() 的类型也是?

【问题讨论】:

【参考方案1】:

Mon是监视器的引用:

monitor_return(ok, Pid, Mon) when is_pid(Pid), is_reference(Mon) ->
    %% Successful start_monitor()...
    ok, Pid, Mon;

(代码为here)

【讨论】:

谢谢!所以Monreference() @MaxHeiber 是的,它是reference()

以上是关于gen_server:啥是`start_monitor/4`中的`Mon`?的主要内容,如果未能解决你的问题,请参考以下文章

匿名`gen_server`实例?

为啥我的 gen_server 不尊重模式匹配?

gen_server:使用新状态调用

如何直观地描述 gen_server?

使用 gen_server 封装一个 mnesia 表?

通过 Jinterface 调用 gen_server?