当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang monitor(Type :: process, Item :: monitor_process_identifier())用法及代码示例


monitor(Type :: process, Item :: monitor_process_identifier()) ->
           MonitorRef
monitor(Type :: port, Item :: monitor_port_identifier()) ->
           MonitorRef
OTP 19.0
monitor(Type :: time_offset, Item :: clock_service) -> MonitorRef
OTP 18.0
类型:
MonitorRef = reference()
registered_name() =atom()
registered_process_identifier() =
registered_name() | {registered_name(),node()}

monitor_process_identifier() =
pid()| registered_process_identifier()

monitor_port_identifier() =port()| registered_name()

发送类型的监控请求Type至由以下标识的实体Item。如果被监控实体不存在或者它改变了被监控状态,则调用者monitor/2通过以下格式的消息进行通知:

{Tag, MonitorRef, Type, Object, Info}
注意

监控请求是一个异步信号。也就是说,信号到达目的地之前需要时间。

Type 可以是以下原子之一: processporttime_offset

A process或者port监视器仅被触发一次,之后它就会从监视进程和被监视实体中删除。当受监视的进程或端口终止、创建时不存在或者与其连接丢失时,监视器将被触发。如果与它的连接丢失,我们不知道它是否仍然存在。当以下情况时,监控也会关闭恶魔/1叫做。

processport 监视器按名称将 RegisteredName 解析为 pid()port() 在监视器实例化时仅一次,以后对名称注册的更改不会影响现有监视器。

当触发 processport 监视器时,将发送具有以下模式的 'DOWN' 消息:

{'DOWN', MonitorRef, Type, Object, Info}

监控消息中MonitorRefType与前面说明的相同,并且:


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}

其中 MonitorRefTypeItem 与上述相同,NewTimeOffset 是新的时间偏移。

当。。。的时候'CHANGE'消息已收到,您在调用时保证不会检索到旧的时间偏移量 erlang:time_offset()。注意调用时可以观察到时间偏移量的变化erlang:time_offset()在你得到之前'CHANGE'信息。

对同一 Item 和/或 Type 多次调用 monitor/2 不是错误;它会产生尽可能多的独立监控实例。

预计监视器函数将得到扩展。也就是说,预计未来版本将支持其他TypeItem

注意

如果或当 monitor/2 被扩展时,将引入监视器消息中的 TagObjectInfo 的其他可能值。

注意

有关分布式信号的一些重要信息,请参阅 阻止信号传输部分中的流程的章节Erlang参考手册.

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 monitor(Type :: process, Item :: monitor_process_identifier()) -> MonitorRef。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。