monitor(Type :: process, Item :: monitor_process_identifier()) ->
MonitorRef
monitor(Type :: port, Item :: monitor_port_identifier()) ->
MonitorRef
OTP 19.0monitor(Type :: time_offset, Item :: clock_service) -> MonitorRef
OTP 18.0MonitorRef = reference()
registered_name() | {registered_name(),node()}
pid()| registered_process_identifier()
发送类型的监控请求Type
至由以下标识的实体Item
。如果被监控实体不存在或者它改变了被监控状态,则调用者monitor/2
通过以下格式的消息进行通知:
{Tag, MonitorRef, Type, Object, Info}
监控请求是一个异步信号。也就是说,信号到达目的地之前需要时间。
Type
可以是以下原子之一: process
、 port
或 time_offset
。
A process
或者port
监视器仅被触发一次,之后它就会从监视进程和被监视实体中删除。当受监视的进程或端口终止、创建时不存在或者与其连接丢失时,监视器将被触发。如果与它的连接丢失,我们不知道它是否仍然存在。当以下情况时,监控也会关闭恶魔/1叫做。
process
或 port
监视器按名称将 RegisteredName
解析为 pid()
或 port()
在监视器实例化时仅一次,以后对名称注册的更改不会影响现有监视器。
当触发 process
或 port
监视器时,将发送具有以下模式的 'DOWN'
消息:
{'DOWN', MonitorRef, Type, Object, Info}
监控消息中MonitorRef
和Type
与前面说明的相同,并且:
Object
-
触发事件的受监控实体。当监视进程或本地端口时,
Object
将等于被监视的pid()
或port()
。当按名称监视进程或端口时,Object
将采用{RegisteredName, Node}
格式,其中RegisteredName
是与monitor/2
调用一起使用的名称,Node
是本地或远程节点名称(对于按名称监视的端口,Node
始终是本地节点名称)。 Info
-
进程的退出原因
noproc
(创建监视器时进程或端口不存在)或noconnection
(与受监视进程所在的节点没有连接)。
- Monitoring a
process
-
在当前进程和由
Item
标识的另一个进程之间创建监视器,该进程可以是位于其他位置的注册进程的pid()
(本地或远程)、原子RegisteredName
或元组{RegisteredName, Node}
。改变在 ERTS 10.0 (OTP 21.0) 之前,如果受监控的进程驻留在未实现远程进程监控的原始节点(例如 erl_interface 或 jinterface)上,则监控进程可能会失败并显示
badarg
。现在,对
monitor
的此类调用将成功并创建一个监视器。但监视器只会监视连接。也就是说,{'DOWN', _, process, _, noconnection}
是唯一可以接收的消息,因为原始节点无法报告受监视进程的状态。 - Monitoring a
port
-
在当前进程和
Item
标识的端口之间创建监视器,该端口可以是port()
(仅限本地)、原子RegisteredName
或位于此节点上的已注册端口的元组{RegisteredName, Node}
。请注意,尝试监视远程端口将导致badarg
。 - Monitoring a
time_offset
-
监控变化
time offset
之间Erlang单调时间和Erlang系统时间。有效1个Item
与以下组合存在time_offset Type
,即原子clock_service
。请注意,原子clock_service
是不是进程的注册名称。在这种情况下,它用作当前运行时系统实例的运行时系统内部时钟服务的标识符。当时间偏移改变时,监视器被触发。如果时间偏移值发生更改,或者偏移在期间从初步更改为最终,则会发生这种情况时间偏移的最终确定当。。。的时候单次时间扭曲模式用来。当从初步时间偏移更改为最终时间偏移时,无论时间偏移值是否更改,都会触发一次监视器。
如果运行时系统处于多时间扭曲模式,当运行时系统检测到操作系统系统时间已经改变。然而,运行时系统不会在发生这种情况时立即检测到这种情况。检查时间偏移的任务计划至少每分钟执行一次,因此在正常操作下将在一分钟内检测到,但在重负载期间可能需要更长的时间。
监视器被触发后不会自动删除。也就是说,时间偏移的重复改变会重复触发监视器。
当监视器被触发时,一条
'CHANGE'
消息将发送到监视进程。'CHANGE'
消息具有以下模式:{'CHANGE', MonitorRef, Type, Item, NewTimeOffset}
其中
MonitorRef
、Type
和Item
与上述相同,NewTimeOffset
是新的时间偏移。当。。。的时候
'CHANGE'
消息已收到,您在调用时保证不会检索到旧的时间偏移量erlang:time_offset()
。注意调用时可以观察到时间偏移量的变化erlang:time_offset()
在你得到之前'CHANGE'
信息。
对同一 Item
和/或 Type
多次调用 monitor/2
不是错误;它会产生尽可能多的独立监控实例。
预计监视器函数将得到扩展。也就是说,预计未来版本将支持其他Type
和Item
。
如果或当 monitor/2
被扩展时,将引入监视器消息中的 Tag
、 Object
和 Info
的其他可能值。
有关分布式信号的一些重要信息,请参阅 阻止信号传输部分中的流程的章节Erlang参考手册.
相关用法
- erlang monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()])用法及代码示例
- erlang monitor(Socket)用法及代码示例
- erlang monitor_nodes(Flag)用法及代码示例
- erlang monitor_scope()用法及代码示例
- erlang module(AbsForms)用法及代码示例
- erlang max用法及代码示例
- erlang member用法及代码示例
- erlang min用法及代码示例
- erlang merge用法及代码示例
- erlang make_dir用法及代码示例
- erlang memory用法及代码示例
- erlang match(Table, Pattern)用法及代码示例
- erlang match_spec_run(List, CompiledMatchSpec)用法及代码示例
- erlang make_tuple(Arity, InitialValue)用法及代码示例
- erlang make_tuple(Arity, DefaultValue, InitList)用法及代码示例
- erlang map_get(Key, Map)用法及代码示例
- erlang map_size(Map)用法及代码示例
- erlang max(Term1, Term2)用法及代码示例
- erlang memory()用法及代码示例
- erlang min(Term1, Term2)用法及代码示例
- erlang map(Fun, Orddict1)用法及代码示例
- erlang merge(Fun, Orddict1, Orddict2)用法及代码示例
- erlang map(Fun, MapOrIter)用法及代码示例
- erlang merge(Map1, Map2)用法及代码示例
- erlang merge_with(Combiner, Map1, Map2)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 monitor(Type :: process, Item :: monitor_process_identifier()) -> MonitorRef。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。