gen_server:start_monitor/4返回值中Mon的具体类型是什么?
结论
你猜测的类型不对,Mon的实际类型是reference()(引用类型)。
原因说明
- 你在
erlang.erl中查到的monitor_process_identifier类型,是调用erlang:monitor/2时传入的被监控对象的标识参数类型,和监控返回的引用Mon完全是两个概念。 gen_server:start_monitor/4内部本质是在启动gen_server进程后,自动调用了erlang:monitor(process, Pid),这个函数的返回值就是唯一的监视器引用,类型固定为reference()。- 这个
Mon的作用有两个:- 后续要取消监控时,作为参数传入
erlang:demonitor(Mon) - 被监控的
gen_server进程退出时,收到的{'DOWN', Mon, process, _Pid, _Reason}消息中,会携带这个引用用来匹配对应的监控关系,避免和其他监控消息混淆。
- 后续要取消监控时,作为参数传入
验证方式
你可以本地随便写一个测试用的gen_server,调用gen_server:start_monitor启动后打印第二个返回值Mon,用BIF is_reference(Mon)判断,会返回true,完全符合reference()的特征。
内容的提问来源于stack exchange,提问作者Max Heiber
相关产品推荐
相关产品推荐

