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