當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。