檢視原始碼 erlang (erts v15.2)
Erlang 的內建函式 (BIF) 和預定義類型。
依照慣例,大多數的內建函式 (BIF) 和所有的預定義類型都包含在這個模組中。某些 BIF 和所有預定義類型或多或少被視為 Erlang 程式語言的一部分,並且是自動匯入的。因此,不需要指定模組名稱。例如,呼叫atom_to_list(erlang)
和 erlang:atom_to_list(erlang)
是相同的。
自動匯入的 BIF 會以 auto-imported
標註,而預定義類型則會以 predefined
標註。
某些自動匯入的 BIF 也允許在 guard 表達式中使用。此類 BIF 會同時標註 auto-imported
和 guard-bif
。
BIF 可能因為各種原因而失敗。如果 BIF 使用了不正確類型的參數呼叫,則所有的 BIF 都會因 badarg
的原因而失敗。其他原因會在每個 BIF 的描述中說明。
摘要
預定義的資料類型
函式或類型的參數數量。
Erlang 的位元字串。
以整數表示的資料位元組。
Erlang 的 fun。
包含位元組和/或 iodata 的二進制或列表。
包含位元組和/或 iodata 的列表。
Erlang 的列表,包含 ContentType
類型的詞彙。
表示 Module:Function/Arity
函式簽名的三元組。
以原子表示的 Erlang 模組。
負整數。
用於表示函式永遠不會返回值,也就是說它總是會拋出異常的類型。
非負整數,也就是任何正整數或 0。
此類型用於表示函式永遠不會返回值;也就是說它總是會拋出異常。
包含某些資料的 binary/0
。
包含某些資料的 bitstring/0
。
包含某些項目的 list/0
。
包含某些字元的 string/0
。
大於零的整數。
Erlang 的參考。
以 ASCII 字元或 Unicode 碼位列表表示的字元字串。
類型
目前的 CPU 拓撲。
time_unit/0
類型也包含以下已棄用的符號時間單位。
識別分配通道的不透明句柄。
根據 Erlang 外部詞彙格式建構的二進制資料物件。
根據 Erlang 外部詞彙格式建構的 iovec/0
類型的詞彙。
包含系統範圍的垃圾收集預設值的列表。
二進制列表。此資料類型適用於與 enif_inspect_iovec
一起使用。
程序最大堆積大小組態。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)
識別 NIF 資源物件的不透明句柄。
程序優先順序。如需詳細資訊,請參閱 process_flag(priority, Level)
可傳遞給 raise/3
的擴充 stacktrace/0
。
請求的排程器綁定類型。
傳送操作的目的地。
Erlang 堆疊追蹤,如 Erlang 參考手冊的錯誤和錯誤處理章節中所述。
Erlang 時間 API 使用的時間單位。
校驗和
計算並返回 Data
的 adler32 校驗和。
透過將先前的校驗和 OldAdler
與 Data
的校驗和組合,繼續計算 adler32 校驗和。
組合兩個先前計算的 adler32 校驗和。
計算並返回 Data
的 crc32(IEEE 802.3 風格)校驗和。
透過將先前的校驗和 OldCrc
與 Data
的校驗和組合,繼續計算 crc32 校驗和。
組合兩個先前計算的 crc32 校驗和。
從 Data
計算 MD5 消息摘要,其中摘要的長度為 128 位元(16 個位元組)。Data
是二進制或小整數和二進制列表。
完成 MD5 Context
的更新,並返回計算的 MD5
消息摘要。
建立 MD5 內容,用於後續的 md5_update/2
呼叫。
使用 Data
更新 MD5 Context
,並返回 NewContext
。
程式碼
如果 Module
有舊程式碼,則返回 true
,否則返回 false
。
檢查由 Pid
識別的節點本地程序是否為 Module
執行舊程式碼。
使 Module
的當前程式碼成為舊程式碼,並從匯出表中刪除此模組的所有參考。如果模組不存在,則返回 undefined
,否則返回 true
。
如果模組 Module
為當前,並且包含一個匯出的函式 Function/Arity
,則返回 true
;或者如果存在具有指定名稱的 BIF(以 C 實作的內建函式),則返回 true
,否則返回 false
。
這個 BIF 對於建立交叉參考工具很有用。
載入由 Binary
中包含的物件程式碼描述的 Module
。
載入並連結一個動態函式庫,其中包含模組的原生實作函式 (NIF)。
傳回所有已載入的 Erlang 模組(當前和舊程式碼),包括預先載入的模組。
如果模組 Module
以當前程式碼載入,則返回 true
;否則返回 false
。它不會嘗試載入模組。
傳回執行時系統中預先載入的 Erlang 模組清單。
移除 Module
的舊程式碼。在使用此 BIF 之前,必須呼叫 check_process_code/2
以檢查是否有任何程序在模組中執行舊程式碼。
分散式 Erlang
強制斷開節點的連線。
從本機節點取得要傳遞至遠端節點的分散式通道資料。
請求當有更多資料可以使用 erlang:dist_ctrl_get_data(DHandle)
來提取時,針對由 DHandle
識別的分散式通道進行通知。
傳回由 DHandle
識別的分散式通道上 get_size
選項的值。如需詳細資訊,請參閱 erlang:dist_ctrl_set_opt/3
函式的 get_size
選項的文件。
為由 DHandle
識別的分散式通道註冊替代的輸入處理程序。
將分散式通道資料從遠端節點傳送到本機節點。
設定由 DHandle
識別的分散式通道上 get_size
選項的值。
如果本機節點處於活動狀態,則傳回本機節點的魔術 Cookie,否則傳回原子 nocookie
。此值由 set_cookie/1
設定。
如果本機節點處於活動狀態,則傳回節點 Node
的魔術 Cookie,否則傳回原子 nocookie
。此值由 set_cookie/2
設定。
如果本機節點處於活動狀態(也就是說,如果節點可以成為分散式系統的一部分),則返回 true
,否則返回 false
。如果節點是以
監控節點 Node
的狀態。如果 Flag
為 true
,則開啟監控。如果 Flag
為 false
,則關閉監控。
行為如同 monitor_node/2
,不同之處在於它允許指定一個額外的選項,即 allow_passive_connect
。
傳回本機節點的名稱。如果節點未處於活動狀態,則改為傳回 nonode@nohost
。
傳回透過正常連線連線至此節點的所有節點清單(也就是說,不會列出隱藏節點)。與 nodes(visible) 相同。
根據指定的引數傳回節點清單。當引數為清單時,傳回的結果是符合清單元素析取的節點清單。
傳回 NodeInfo
元組的清單。
將本機節點的魔術 Cookie 設定為原子 Cookie
,該原子也是所有沒有使用 set_cookie/2
設定明確 Cookie 的節點的 Cookie Cookie
。
將 Node
的魔術 Cookie 設定為原子 Cookie
。如果 Node
是本機節點,則該函式會將所有其他節點(沒有使用此函式設定明確 Cookie 的節點)的 Cookie 設定為 Cookie
。
Erlang 項
傳回一個整數或浮點數,該整數或浮點數是 Float
或 Int
的算術絕對值。
傳回一個新的元組,該元組比 Tuple1
多一個元素,並且包含 Tuple1
中的元素,後面接著 Term
作為最後一個元素。
傳回對應於 Atom
的文字表示形式的二進位。
傳回對應於 Atom
的文字表示形式的 Unicode 程式碼點清單。
提取由 PosLen
描述的二進位部分。
傳回文字表示形式為 Binary
的原子。如果 Encoding
為 utf8
或 unicode
,則二進位必須包含有效的 UTF-8 序列。
與 binary_to_atom/2
相同,但原子必須存在。
傳回文字表示形式為 Binary
的浮點數。
傳回文字表示形式為 Binary
的整數。
傳回以 Base
為底的文字表示形式為 Binary
的整數。
傳回對應於 Binary
的位元組的整數清單。
與 binary_to_list/1
相同,但傳回一個對應於 Binary
中從位置 Start
到位置 Stop
的位元組的整數清單。二進位中的位置從 1 開始編號。
傳回 Erlang 項,該項是解碼二進位物件 Binary
的結果,該物件必須根據 Erlang 外部項格式進行編碼。
等效於 binary_to_term(Binary)
,但可以設定為適合特殊用途。
傳回一個整數,該整數是 Bitstring
的位元大小。
傳回對應於 Bitstring
的位元組的整數清單。
傳回一個整數,該整數是包含 Bitstring
所需的位元組數。也就是說,如果 Bitstring
中的位元數不能被 8 整除,則產生的位元組數會向上捨入。
傳回不小於 Number
的最小整數。
根據 Type
指定的封包協定解碼二進位 Bin
。與具有選項 {packet,Type}
的 Socket 所做的封包處理類似。
傳回一個新的元組,其中元素在元組 Tuple1
中移除 Index
的位置。
在標準輸出上印出 Term
的文字表示形式。
傳回 Tuple
的第 N
個元素(從 1 開始編號)。
計算以 Erlang 外部項格式編碼的項目的最大位元組大小,而無需執行編碼。
計算以 Erlang 外部項格式編碼的項目的最大位元組大小,而無需執行編碼。
透過將 Number
轉換為浮點數來傳回浮點數。
傳回一個對應於使用固定小數點格式的 Float
的文字表示形式的二進位。
傳回一個對應於使用固定小數點格式的 Float
的文字表示形式的字串。
傳回不大於 Number
的最大整數。
傳回一個包含函式 Fun
資訊的清單。每個清單元素都是一個元組。元組的順序是未定義的,並且在未來版本中可以新增更多元組。
以 {Item,Info}
形式傳回 Fun
的資訊,如 Item
所指定。
傳回 String
,代表建立 Fun
的程式碼。
傳回 List
的頭,也就是第一個元素。
傳回一個新的元組,其中元素 Term
插入到元組 Tuple1
中的位置 Index
。新元組 Tuple2
中從位置 Index
開始的所有元素都向上推高一步。
傳回對應於 Integer
的文字表示形式的二進位。
傳回對應於以 Base
為底的 Integer
的文字表示形式的二進位。
傳回一個對應於 Integer
的文字表示形式的字串。
傳回一個對應於以 Base
為底的 Integer
的文字表示形式的字串。
傳回一個整數,該整數是 iolist_to_binary(Item)
的結果的二進位大小(以位元組為單位)。
傳回一個由 IoListOrBinary
中的整數和二進位組成的二進位。
傳回一個 iovec,該 iovec 是由 IoListOrBinary
中的整數和二進位資料所組成。當您想要將 iolist 平坦化,但又不需要單一二進位資料時,此函數非常有用。這對於將資料傳遞給 NIF 函數 (例如 enif_inspect_iovec
),或進行更有效率的訊息傳遞時很有幫助。使用此函數而不是 iolist_to_binary/1
的優點是,它不需要複製 堆外二進位資料。
如果 Term
是原子,則傳回 true
,否則傳回 false
。
如果 Term
是二進位資料,則傳回 true
,否則傳回 false
。
如果 Term
是位元字串 (包括二進位資料),則傳回 true
,否則傳回 false
。
如果 Term
是原子 true
或原子 false
(即布林值),則傳回 true
。否則傳回 false
。
如果 Term
是浮點數,則傳回 true
,否則傳回 false
。
如果 Term
是 fun,則傳回 true
,否則傳回 false
。
如果 Term
是一個可以與 Arity
個參數一起套用的 fun,則傳回 true
,否則傳回 false
。
如果 Term
是整數,則傳回 true
,否則傳回 false
。
如果 Term
是包含零個或多個元素的列表,則傳回 true
,否則傳回 false
。
如果 Term
是 map,則傳回 true
,否則傳回 false
。
如果 map Map
包含 Key
,則傳回 true
,如果沒有包含 Key
,則傳回 false
。
如果 Term
是整數或浮點數,則傳回 true
。否則傳回 false
。
如果 Term
是程序識別碼,則傳回 true
,否則傳回 false
。
如果 Term
是埠識別碼,則傳回 true
,否則傳回 false
。
如果 Term
是元組,且其第一個元素是 RecordTag
,則傳回 true
。否則傳回 false
。
RecordTag
必須是原子。
如果 Term
是參考,則傳回 true
,否則傳回 false
。
如果 Term
是元組,則傳回 true
,否則傳回 false
。
傳回 List
的長度。
傳回文字表示為 String
的原子。
傳回一個由 IoList
中的整數和二進位資料組成的二進位資料。
傳回一個由 BitstringList
中的整數和位元字串組成的位元字串。(允許 BitstringList
中的最後一個尾部為位元字串。)
傳回文字表示為 String
的原子,但前提是該原子已存在。如果原子已透過載入程式碼或建立原子屬於其中一部分的 term,由執行階段系統建立,則該原子存在。
傳回文字表示為 String
的浮點數。
傳回文字表示為 String
的整數。
傳回以 Base
為基底,文字表示為 String
的整數。
傳回文字表示為 String
的程序識別碼。
傳回文字表示為 String
的埠識別碼。
傳回文字表示為 String
的參考。
傳回對應於 List
的元組,例如
傳回一個 唯一參考。該參考在已連線的節點之間是唯一的。
建立一個具有指定 Arity
的新元組,其中所有元素都是 InitialValue
。
建立一個大小為 Arity
的元組,其中每個元素的值都是 DefaultValue
,然後從 InitList
中填入值。
如果 Map
包含 Key
,則傳回與 Key
關聯的值 Value
。
傳回一個整數,即 Map
中鍵值對的數量。
測試在呼叫 ets:select/2
和 trace:function/4
時使用的比對規格。
傳回 Term1
和 Term2
中較大的值。如果使用 ==
運算子比較時,term 相等,則傳回 Term1
。
傳回 Term1
和 Term2
中較小的值。如果使用 ==
運算子比較時,term 相等,則傳回 Term1
。
傳回 Arg
的來源節點。Arg
可以是程序識別碼、參考或埠。如果 Arg
源自本機節點,且本機節點未處於活動狀態,則傳回 nonode@nohost
。
與 phash2/2
等效。
可攜式雜湊函數,對於相同的 Erlang term,無論機器架構和 ERTS 版本為何,都會提供相同的雜湊值。
傳回對應於 Pid
文字表示的字串。
傳回對應於埠識別碼 Port
文字表示的字串。
傳回對應於 Ref
文字表示的字串。
透過捨入 Number
,傳回一個整數。
傳回一個元組,該元組是引數 Tuple1
的副本,其中由整數引數 Index
指定的元素 (第一個元素的索引為 1) 由引數 Value
取代。
傳回元組中的元素數量,或二進位資料或位元字串中的位元組數。
傳回一個包含二進位資料的元組,這些二進位資料是將 Bin
在位置 Pos
分割成兩個部分的結果。
傳回一個二進位資料物件,該物件是根據 Erlang 外部 term 格式 編碼 Term
的結果。
傳回一個二進位資料物件,該物件是根據 Erlang 外部 term 格式 編碼 Term
的結果。
根據 Erlang 外部 term 格式,以 ext_iovec/0
傳回 Term
的編碼。
根據 Erlang 外部 term 格式,以 ext_iovec/0
傳回 Term
的編碼。
傳回 List
的尾部,也就是減去第一個元素的列表。
截斷 Number
的小數位數。
傳回一個整數,即 Tuple
中的元素數量。
傳回對應於 Tuple
的列表。Tuple
可以包含任何 Erlang term。範例
產生並傳回一個在目前執行階段系統實例上唯一的整數。與呼叫 erlang:unique_integer([])
等效。
產生並傳回一個在目前執行階段系統實例上唯一的整數。此整數是唯一的,因為此 BIF 使用同一組修飾符,在目前的執行階段系統實例上不會多次傳回相同的整數。每個整數值當然可以透過其他方式建構。
Processes and Ports
建立一個別名,該別名可用於向建立別名的程序傳送訊息。當別名已停用時,使用別名傳送的訊息將會被捨棄。可以使用 unalias/1
來停用別名。
呼叫一個 fun,並將 Args
中的元素當作引數傳遞。
傳回將 Module
中的 Function
套用至 Args
的結果。所套用的函數必須從 Module
匯出。函數的arity 是 Args
的長度。
此實作相依函數會遞增呼叫程序的削減計數器。
如果 MonitorRef
是呼叫程序透過呼叫 monitor/2
取得的參考,則會關閉此監視。如果監視已關閉,則不會發生任何事。
傳回的值是 true
,除非 info
是 OptionList
的一部分。
傳回程序字典並將其刪除。
傳回與 Key
關聯的值 Val
,並將其從程序字典中刪除。如果沒有值與 Key
關聯,則傳回 undefined
。
引發類別為 error
,原因為 Reason
的例外狀況。
使用原因 Reason
引發類別為 error
的例外。 Args
預期是目前函式的參數列表,或是原子 none
。
使用原因 Reason
引發類別為 error
的例外。 Args
預期是目前函式的參數列表,或是原子 none
。
使用退出原因 Reason
引發類別為 exit
的例外。
向 Pid
所識別的程序或埠傳送帶有退出原因 Reason
的退出信號。
強制立即對正在執行的程序進行垃圾回收。
對 Pid
所識別的本機節點程序進行垃圾回收。
將程序字典以 {Key, Val}
元組的列表形式回傳。回傳列表中的項目順序不拘。
回傳程序字典中與 Key
相關聯的值 Val
,如果 Key
不存在則回傳 undefined
。
回傳程序字典中所有鍵的列表。回傳列表中的項目順序不拘。
回傳在程序字典中與值 Val
相關聯的鍵的列表。回傳列表中的項目順序不拘。
回傳評估此函式的程序的群組領導者的程序識別符。
將 Pid
的群組領導者設定為 GroupLeader
。通常,當從某個 shell 啟動的程序要擁有與 init
不同的群組領導者時會使用此設定。
使呼叫程序進入等待狀態,其中記憶體分配已盡可能減少。如果該程序預計不會很快收到任何訊息,則這非常有用。
Pid
必須參照本機節點上的程序。
在呼叫程序與由 PidOrPort
所識別的另一個程序或埠之間建立並啟用連結。
向 Item
所識別的實體傳送類型為 Type
的監控請求。
運作方式與 error/1
完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。
運作方式與 error/2
完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。
回傳開啟新的 Erlang 埠的結果作為埠識別符。埠可以被視為外部 Erlang 程序。
對埠執行同步呼叫。Operation
和 Data
的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此功能。
關閉開啟的埠。大致與 Port ! {self(), close}
相同,但錯誤行為(請參閱下方)、同步,且埠不會以 {Port, closed}
回覆除外。
向埠傳送資料。與 Port ! {PortOwner, {command, Data}}
相同,但錯誤行為和同步(請參閱下方)除外。
將埠的所有者(已連接的埠)設定為 Pid
。大致與 Port ! {Owner, {connect, Pid}}
相同,但以下除外
對埠執行同步控制操作。Operation
和 Data
的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此控制功能。
回傳包含有關 Port
的資訊的元組列表,如果埠未開啟,則回傳 undefined
。
回傳有關 Port
的資訊。
回傳與本機節點上存在的所有埠對應的埠識別符列表。
在 標準錯誤 上寫入有關本機程序 Pid
的資訊。
將指定的程序旗標設定為指定的值。回傳旗標的先前值。
以與 process_flag/2
相同的方式,為程序 Pid
設定某些旗標。回傳旗標的舊值。 Flag
的有效值僅為 process_flag/2
中允許的值的子集,即 save_calls
。
回傳包含有關 Pid
所識別的程序的各種資訊的 InfoTuple
列表,如果程序未執行,則回傳 undefined
。
回傳有關 Pid
所識別的程序的資訊,由 Item
或 ItemList
指定。如果程序未執行,則回傳 undefined
。
回傳與本機節點上目前存在的所有程序對應的程序識別符列表。
將新的 Key
新增至程序字典,並與值 Val
相關聯,且回傳 undefined
。如果 Key
存在,則會刪除舊值並以 Val
取代,且函式會回傳舊值。
引發具有指定類別、原因和呼叫堆疊回溯(*堆疊追蹤*)的例外。
在 名稱註冊表
中使用程序識別符 (pid) 或埠識別符註冊名稱 RegName
。RegName
(必須是原子)可以用於傳送運算子 (RegName ! Message
) 和大多數其他以 pid 或埠識別符作為引數的 BIF 中,以取代 pid 或埠識別符。
回傳使用 register/2
註冊的名稱列表。
減少 Suspendee
所識別的程序的暫停計數。
回傳呼叫程序的程序識別符。
傳送訊息並回傳 Msg
。這與使用 傳送運算子 相同:Dest ! Msg
。
傳送訊息並回傳 ok
,或不傳送訊息但回傳其他內容(請參閱下方)。否則與 erlang:send/2
相同。
傳送訊息而不暫停呼叫者。
回傳由將 Fun
應用於空列表 []
所啟動的新程序的程序識別符。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於 Node
上的空列表 []
所啟動的新程序的程序識別符。如果 Node
不存在,則會回傳無用的 pid。否則運作方式與 spawn/3
相同。
回傳由將 Module:Function
應用於 Args
所啟動的新程序的程序識別符。
回傳由將 Module:Function
應用於 Node
上的 Args
所啟動的新程序的程序識別符 (pid)。如果 Node
不存在,則會回傳無用的 pid。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於空列表 []
所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於 Node
上的空列表 []
所啟動的新程序的程序識別符 (pid)。會在呼叫程序與新程序之間原子地建立連結。如果 Node
不存在,則會回傳無用的 pid,並向呼叫程序傳送帶有原因 noconnection
的退出信號。否則運作方式與 spawn/3
相同。
回傳由將 Module:Function
應用於 Args
所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3
相同。
在 Node
節點上,將 Module:Function
應用於 Args
所啟動的新進程的進程識別碼 (pid)。呼叫進程與新進程之間會以原子方式建立連結。如果 Node
不存在,則會返回一個無用的 pid,並向呼叫進程發送帶有原因 noconnection
的退出信號。否則行為與 spawn/3
相同。
返回一個新進程的進程識別碼,該進程由將 Fun
應用於空列表 []
所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3
相同。
返回一個新進程的進程識別碼,該進程由在節點 Node
上將 Fun
應用於空列表 []
所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3
相同。
透過將 Module:Function
應用於 Args
來啟動一個新進程。同時監控該進程。返回進程識別碼和監視器的參考。否則行為與 spawn/3
相同。
透過將 Module:Function
應用於節點 Node
上的 Args
來啟動一個新進程。同時監控該進程。返回進程識別碼和監視器的參考。否則行為與 spawn/3
相同。
返回一個新進程的進程識別碼 (pid),該進程由將 Fun
應用於空列表 []
所啟動。否則行為與 spawn_opt/4
相同。
返回一個新進程的進程識別碼 (pid),該進程由在 Node
上將 Fun
應用於空列表 []
所啟動。如果 Node
不存在,則會返回一個無用的 pid。否則行為與 spawn_opt/4
相同。
行為與 spawn/3
相同,除了在建立進程時指定了一個額外的選項列表。
返回一個新進程的進程識別碼 (pid),該進程由在 Node
上將 Module:Function
應用於 Args
所啟動。如果 Node
不存在,則會返回一個無用的 pid。否則行為與 spawn_opt/4
相同。
等同於呼叫 spawn_request(node(),Fun,[])
。也就是說,在本地節點上發出不帶任何選項的 spawn 請求。
等同於 spawn_request(node(),Fun,Options)
或 spawn_request(Node,Fun,[])
,具體取決於引數。
非同步傳送 spawn 請求。返回請求識別碼 ReqId
。
放棄先前發出的 spawn 請求。ReqId
對應於先前由目前進程呼叫 spawn_request()
所返回的請求識別碼。也就是說,只有發出請求的進程才能放棄該請求。
暫停由 Suspendee
識別的進程。等同於呼叫 erlang:suspend_process(Suspendee, [])
。
增加由 Suspendee
識別的進程的暫停計數,如果該進程尚未處於暫停狀態,則將其置於暫停狀態。在進程恢復之前,暫停的進程不會被排程執行。
引發 throw
類別的例外狀況。旨在用於從函數執行非本地返回。
停用呼叫進程先前建立的別名 Alias
。
移除呼叫進程與另一個進程或由 Id
識別的埠之間的連結。
嘗試讓具有相同或更高優先順序的其他進程 (如果有的話) 在返回之前有機會執行。無法保證在呼叫和返回 erlang:yield/0
之間會執行任何其他進程。
System
等同於呼叫 halt(0, [])
。
等同於呼叫 halt(HaltType, [])
。
停止執行階段系統。
返回一個列表,其中包含有關 Erlang 模擬器動態配置的記憶體資訊。
返回為 Type
類型的記憶體配置的記憶體大小 (以位元組為單位)。引數也可以指定為 memory_type/0
原子列表,在這種情況下,會返回對應的 {memory_type(), Size :: integer >= 0}
元組列表。
返回有關目前系統的統計資料。
將系統旗標設定為給定的值。
返回有關目前系統的資訊。
返回由 erlang:system_monitor/2
設定的目前系統監控設定,形式為 {MonitorPid, Options}
,如果不存在任何設定,則返回 undefined
。
使用引數 undefined
呼叫時,將清除所有系統效能監控設定。
設定系統效能監控選項。MonitorPid
是接收系統監控訊息的本機進程識別碼 (pid)。
返回由 erlang:system_profile/2
設定的目前系統分析設定,形式為 {ProfilerPid, Options}
,如果沒有任何設定,則返回 undefined
。選項的順序可能與設定時的順序不同。
設定系統分析器選項。ProfilerPid
是接收分析訊息的本機進程識別碼 (pid) 或埠。接收者會排除在所有分析之外。第二個引數是分析選項的列表。
Time and timers
等同於 erlang:cancel_timer(TimerRef, [])
。
取消由 erlang:start_timer
或 erlang:send_after
建立的計時器。TimerRef
識別計時器,並由建立計時器的 BIF 返回。
將時間單位 FromUnit
的 Time
值轉換為對應的時間單位 ToUnit
的 ConvertedTime
值。使用 floor/1
函數將結果四捨五入。
以 {Year, Month, Day}
形式返回目前日期。
返回目前的本地日期和時間,形式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。
如果底層作業系統支援,則將本地日期和時間轉換為世界協調時間 (UTC)。否則,不執行轉換並返回 Localtime
。
將本地日期和時間轉換為世界協調時間 (UTC),如同 erlang:localtime_to_universaltime/1
,但呼叫者決定是否啟用日光節約時間。
以 時間單位 native
形式返回目前的 Erlang 單調時間。這是自某個未指定的時間點以來單調增加的時間。
返回目前的 Erlang 單調時間,並轉換為作為引數傳遞的 Unit
。
等同於 erlang:read_timer(TimerRef, [])
。
讀取由 erlang:start_timer
或 erlang:send_after
建立的計時器的狀態。TimerRef
識別計時器,並由建立計時器的 BIF 返回。
等同於 erlang:send_after(Time, Dest, Msg, [])
。
啟動計時器。當計時器過期時,訊息 Msg
會傳送到由 Dest
識別的進程。除了逾時訊息的格式外,此函數的工作方式與 erlang:start_timer/4
完全相同。
等同於 erlang:start_timer(Time, Dest, Msg, [])
。
啟動計時器。當計時器過期時,訊息 {timeout, TimerRef, Msg}
會傳送到由 Dest
識別的進程。
以 時間單位 native
形式返回目前的 Erlang 系統時間。
返回目前的 Erlang 系統時間,並轉換為作為引數傳遞的 Unit
。
以 {Hour, Minute, Second}
形式返回目前時間。
以 時間單位 native
形式返回 Erlang 單調時間 和 Erlang 系統時間 之間的目前時間偏移量。目前的 時間偏移量加上 Erlang 單調時間會得出對應的 Erlang 系統時間。
返回 Erlang 單調時間 和 Erlang 系統時間 之間的目前時間偏移量,並轉換為作為引數傳遞的 Unit
。
以 {MegaSecs, Secs, MicroSecs}
格式返回目前的 Erlang 系統時間。
如果底層作業系統支援,則根據協調世界時 (UTC) 傳回目前日期和時間,格式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。否則,erlang:universaltime()
等同於 erlang:localtime()
。傳回值基於作業系統系統時間。
如果底層作業系統支援,則將協調世界時 (UTC) 日期和時間轉換為當地日期和時間,格式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。否則,不執行轉換,並傳回 Universaltime
。
追蹤
開啟或關閉靜態舊版追蹤工作階段中程序或埠上的追蹤旗標。
呼叫此函式可確保已傳遞所有追蹤訊息。
傳回靜態舊版追蹤工作階段中關於埠、程序、函式或事件的追蹤資訊。
等同於 erlang:trace_pattern(Event, MatchSpec, [])
,為保持回溯相容性而保留。
在靜態舊版追蹤工作階段中設定呼叫、傳送和接收追蹤的追蹤模式。
已棄用的函式
警告
此函式已棄用。請勿使用。
警告
此函式已棄用,新程式碼應使用
erlang:phash2/2
。請注意,erlang:phash(X,N)
不一定等於erlang:phash2(X,N)
預先定義的資料類型
-type nil() :: [].
空的 list/0
。
-type any() :: any().
所有可能的 Erlang 詞彙。與 term/0
同義。
-type arity() :: arity().
函式或類型的參數數量。
-type atom() :: atom().
Erlang 的原子。
-type binary() :: <<_:_*8>>.
Erlang 的二進制,也就是大小可以被 8 整除的位元字串。
-type bitstring() :: <<_:_*1>>.
Erlang 的位元字串。
-type boolean() :: true | false.
布林值。
-type byte() :: 0..255.
以整數表示的資料位元組。
-type char() :: 0..1114111.
以整數表示的 ASCII 字元或 unicode
碼位。
-type dynamic() :: dynamic().
dynamic 類型,代表靜態未知的類型。
-type float() :: float().
Erlang 的浮點數。
-type function() :: fun().
Erlang 的 fun。
-type integer() :: integer().
Erlang 的整數。
包含位元組和/或 iodata 的二進制或列表。
此資料類型用於表示要使用任何 I/O 模組輸出的資料。例如:file:write/2
或 gen_tcp:send/2
。
若要將 iodata/0
詞彙轉換為 binary/0
,您可以使用 iolist_to_binary/2。若要將 string/0
或 unicode:chardata/0
轉碼為 iodata/0
,您可以使用 unicode:characters_to_binary/1
。
-type iolist() :: maybe_improper_list(byte() | binary() | iolist(), binary() | []).
包含位元組和/或 iodata 的列表。
此資料類型用於表示要使用任何 I/O 模組輸出的資料。例如:file:write/2
或 gen_tcp:send/2
。
在大多數情況下,您會想要使用 iodata/0
而不是此類型。
-type list() :: [any()].
Erlang 的列表,包含任何類型的詞彙。
-type list(ContentType) :: [ContentType].
Erlang 的列表,包含 ContentType
類型的詞彙。
Erlang 的 map,包含任意數量的鍵值關聯。
-type maybe_improper_list() :: maybe_improper_list(any(), any()).
-type maybe_improper_list(ContentType, TerminationType) :: maybe_improper_list(ContentType, TerminationType).
表示 Module:Function/Arity
函式簽名的三元組。
-type module() :: atom().
以原子表示的 Erlang 模組。
-type neg_integer() :: neg_integer().
負整數。
-type no_return() :: none().
用於表示函式永遠不會返回值,也就是說它總是會拋出異常的類型。
-type node() :: atom().
以原子表示的 Erlang 節點。
-type non_neg_integer() :: non_neg_integer().
非負整數,也就是任何正整數或 0。
-type none() :: none().
此類型用於表示函式永遠不會返回值;也就是說它總是會拋出異常。
在規格中,為了清楚起見,請使用 no_return/0
。
-type nonempty_binary() :: <<_:8, _:_*8>>.
包含某些資料的 binary/0
。
-type nonempty_bitstring() :: <<_:1, _:_*1>>.
包含某些資料的 bitstring/0
。
-type nonempty_improper_list(ContentType, TerminationType) :: nonempty_improper_list(ContentType, TerminationType).
包含某些項目的 maybe_improper_list/2。
-type nonempty_list() :: [any(), ...].
包含某些項目的 list/0
。
-type nonempty_list(ContentType) :: [ContentType, ...].
包含某些項目的 list(ContentType)。
-type nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any()).
包含某些項目的 maybe_improper_list/0
。
-type nonempty_maybe_improper_list(ContentType, TerminationType) :: nonempty_maybe_improper_list(ContentType, TerminationType).
-type nonempty_string() :: [char(), ...].
包含某些字元的 string/0
。
Erlang 的數字。
-type pid() :: pid().
Erlang 的程序識別符。
-type port() :: port().
Erlang 的埠識別符。
-type pos_integer() :: pos_integer().
大於零的整數。
-type reference() :: reference().
Erlang 的參考。
-type string() :: [char()].
以 ASCII 字元或 Unicode 碼位列表表示的字元字串。
-type term() :: any().
所有可能的 Erlang 詞彙。與 any/0
同義。
-type timeout() :: infinity | non_neg_integer().
可以傳遞給 接收表達式的逾時值。
-type tuple() :: tuple().
Erlang 的元組。
類型
-type bitstring_list() :: maybe_improper_list(byte() | bitstring() | bitstring_list(), bitstring() | []).
-type cpu_topology() :: [LevelEntry :: level_entry()] | undefined.
目前的 CPU 拓撲。
node
指的是非均勻記憶體存取(NUMA)節點。thread
指的是硬體執行緒(例如,Intel 超執行緒)。
如果只有一個條目存在且 InfoList
為空,則可以省略 CpuTopology
術語中的層級。
thread
只能是 core
的子層級。core
可以是 processor
或 node
的子層級。processor
可以在頂層,或是 node
的子層級。node
可以在頂層,或是 processor
的子層級。也就是說,NUMA 節點可以是處理器內部或處理器外部的。CPU 拓樸可以包含處理器內部和外部 NUMA 節點的混合,只要每個邏輯 CPU 屬於一個 NUMA 節點。快取階層結構不屬於 CpuTopology
類型的一部分,但會在未來版本中加入。其他東西也可能在未來版本中加入 CPU 拓樸。因此,請預期 CpuTopology
類型會變更。
-type deprecated_time_unit() :: seconds | milli_seconds | micro_seconds | nano_seconds.
time_unit/0
類型也包含以下已棄用的符號時間單位。
seconds
- 與second
相同。milli_seconds
- 與millisecond
相同。micro_seconds
- 與microsecond
相同。nano_seconds
- 與nanosecond
相同。
-opaque dist_handle()
識別分配通道的不透明句柄。
-type ext_binary() :: binary().
根據 Erlang 外部詞彙格式建構的二進制資料物件。
-type ext_iovec() :: iovec().
根據 Erlang 外部詞彙格式建構的 iovec/0
類型的詞彙。
-type fun_info_item() :: arity | env | index | name | module | new_index | new_uniq | pid | type | uniq.
-type garbage_collection_defaults() :: [{max_heap_size, non_neg_integer()} | {min_bin_vheap_size, non_neg_integer()} | {min_heap_size, non_neg_integer()} | {fullsweep_after, non_neg_integer()}].
包含系統範圍的垃圾收集預設值的列表。
-type halt_options() :: [{flush, boolean()} | {flush_timeout, Timeout :: 0..2147483647 | infinity}].
-type info_list() :: [].
-type iovec() :: [binary()].
二進制列表。此資料類型適用於與 enif_inspect_iovec
一起使用。
-type level_tag() :: core | node | processor | thread.
-type match_variable() :: atom().
-type max_heap_size() :: Size :: non_neg_integer() | #{size => non_neg_integer(), kill => boolean(), error_logger => boolean(), include_shared_binaries => boolean()}.
程序最大堆積大小組態。如需詳細資訊,請參閱 process_flag(max_heap_size, MaxHeapSize)
-type memory_type() ::
total | processes | processes_used | system | atom | atom_used | binary | code | ets.
-type message_queue_data() :: off_heap | on_heap.
請參閱 process_flag(message_queue_data, MQD)
。
程序訊息佇列資料組態。如需詳細資訊,請參閱 process_flag(message_queue_data, MQD)
-type monitor_option() :: {alias, explicit_unalias | demonitor | reply_demonitor} | {tag, term()}.
請參閱 monitor/3
。
-type monitor_port_identifier() :: port() | registered_name().
-type monitor_process_identifier() :: pid() | registered_process_identifier().
-opaque nif_resource()
識別 NIF 資源物件的不透明句柄。
-opaque prepared_code()
-type priority_level() :: low | normal | high | max.
程序優先順序。如需詳細資訊,請參閱 process_flag(priority, Level)
-type process_info_item() :: async_dist | backtrace | binary | catchlevel | current_function | current_location | current_stacktrace | dictionary | {dictionary, Key :: term()} | error_handler | garbage_collection | garbage_collection_info | group_leader | heap_size | initial_call | links | label | last_calls | memory | message_queue_len | messages | min_heap_size | min_bin_vheap_size | monitored_by | monitors | message_queue_data | parent | priority | reductions | registered_name | sequential_trace_token | stack_size | status | suspending | total_heap_size | trace | trap_exit.
-type process_info_result_item() :: {async_dist, Enabled :: boolean()} | {backtrace, Bin :: binary()} | {binary, BinInfo :: [{non_neg_integer(), non_neg_integer(), non_neg_integer()}]} | {catchlevel, CatchLevel :: non_neg_integer()} | {current_function, {Module :: module(), Function :: atom(), Arity :: arity()} | undefined} | {current_location, {Module :: module(), Function :: atom(), Arity :: arity(), Location :: [{file, Filename :: string()} | {line, Line :: pos_integer()}]}} | {current_stacktrace, Stack :: [stack_item()]} | {dictionary, Dictionary :: [{Key :: term(), Value :: term()}]} | {{dictionary, Key :: term()}, Value :: term()} | {error_handler, Module :: module()} | {garbage_collection, GCInfo :: [{atom(), non_neg_integer()}]} | {garbage_collection_info, GCInfo :: [{atom(), non_neg_integer()}]} | {group_leader, GroupLeader :: pid()} | {heap_size, Size :: non_neg_integer()} | {initial_call, mfa()} | {links, PidsAndPorts :: [pid() | port()]} | {label, term()} | {last_calls, false | (Calls :: [mfa()])} | {memory, Size :: non_neg_integer()} | {message_queue_len, MessageQueueLen :: non_neg_integer()} | {messages, MessageQueue :: [term()]} | {min_heap_size, MinHeapSize :: non_neg_integer()} | {min_bin_vheap_size, MinBinVHeapSize :: non_neg_integer()} | {max_heap_size, MaxHeapSize :: max_heap_size()} | {monitored_by, MonitoredBy :: [pid() | port() | nif_resource()]} | {monitors, Monitors :: [{process | port, Pid :: pid() | port() | {RegName :: atom(), Node :: node()}}]} | {message_queue_data, MQD :: message_queue_data()} | {parent, pid() | undefined} | {priority, Level :: priority_level()} | {reductions, Number :: non_neg_integer()} | {registered_name, [] | (Atom :: atom())} | {sequential_trace_token, [] | (SequentialTraceToken :: term())} | {stack_size, Size :: non_neg_integer()} | {status, Status :: exiting | garbage_collecting | waiting | running | runnable | suspended} | {suspending, SuspendeeList :: [{Suspendee :: pid(), ActiveSuspendCount :: non_neg_integer(), OutstandingSuspendCount :: non_neg_integer()}]} | {total_heap_size, Size :: non_neg_integer()} | {trace, InternalTraceFlags :: non_neg_integer()} | {trap_exit, Boolean :: boolean()}.
-type raise_stacktrace() :: [{module(), atom(), arity() | [term()]} | {function(), arity() | [term()]}] | stacktrace().
可傳遞給 raise/3
的擴充 stacktrace/0
。
-type registered_name() :: atom().
-type registered_process_identifier() :: registered_name() | {registered_name(), node()}.
-type scheduler_bind_type() ::
no_node_processor_spread | no_node_thread_spread | no_spread | processor_spread | spread |
thread_spread | thread_no_node_processor_spread | unbound.
請求的排程器綁定類型。
-type send_destination() :: pid() | reference() | port() | (RegName :: atom()) | {RegName :: atom(), Node :: node()}.
傳送操作的目的地。
這可以是遠端或本機程序識別符、(本機) 連接埠、表示程序別名的參考、本機註冊的名稱,或是用於另一個節點上註冊名稱的元組 {RegName, Node}
。
-type spawn_opt_option() :: link | monitor | {monitor, MonitorOpts :: [monitor_option()]} | {priority, Level :: priority_level()} | {fullsweep_after, Number :: non_neg_integer()} | {min_heap_size, Size :: non_neg_integer()} | {min_bin_vheap_size, VSize :: non_neg_integer()} | {max_heap_size, Size :: max_heap_size()} | {message_queue_data, MQD :: message_queue_data()} | {async_dist, Enabled :: boolean()}.
spawn_opt()
的選項。
-type stacktrace() :: [{module(), atom(), arity() | [term()], [stacktrace_extrainfo()]} | {function(), arity() | [term()], [stacktrace_extrainfo()]}].
Erlang 堆疊追蹤,如 Erlang 參考手冊的錯誤和錯誤處理章節中所述。
-type stacktrace_extrainfo() :: {line, pos_integer()} | {file, unicode:chardata()} | {error_info, #{module => module(), function => atom(), cause => term()}} | {atom(), term()}.
-type sub_level() :: [LevelEntry :: level_entry()] | (LogicalCpuId :: {logical, non_neg_integer()}).
-type system_monitor_option() :: busy_port | busy_dist_port | {long_gc, non_neg_integer()} | {long_message_queue, {Disable :: non_neg_integer(), Enable :: pos_integer()}} | {long_schedule, non_neg_integer()} | {large_heap, non_neg_integer()}.
-type system_profile_option() ::
exclusive | runnable_ports | runnable_procs | scheduler | timestamp | monotonic_timestamp |
strict_monotonic_timestamp.
-type time_unit() :: pos_integer() | second | millisecond | microsecond | nanosecond | native | perf_counter | deprecated_time_unit().
Erlang 時間 API 使用的時間單位。
支援的時間單位表示
PartsPerSecond :: integer() >= 1
- 以每秒的分數表示的時間單位。也就是說,時間單位等於1/PartsPerSecond
秒。second
- 以整數1
表示的時間單位符號表示。millisecond
- 以整數1000
表示的時間單位符號表示。microsecond
- 以整數1000_000
表示的時間單位符號表示。nanosecond
- 以整數1000_000_000
表示的時間單位符號表示。native
- Erlang 執行時系統使用的原生時間單位符號表示。native
時間單位是在執行時系統啟動時決定的,並保持不變直到執行時系統終止。如果執行時系統停止然後再次啟動(即使在同一部機器上),新的執行時系統實例的native
時間單位可能與舊的執行時系統實例的native
時間單位不同。可以透過呼叫
erlang:convert_time_unit(1, second, native)
來取得native
時間單位的近似值。結果等於每秒的native
時間單位整數。如果每秒的native
時間單位數加總不是整數,則結果會向下捨入。注意
native
時間單位的值或多或少沒有提供關於時間值品質的資訊。它為時間值的解析度和精確度設定了限制,但沒有提供關於時間值準確度的資訊。native
時間單位的解析度與時間值的解析度可能顯著不同。perf_counter
- Erlang 執行時系統使用的效能計數器時間單位符號表示。perf_counter
時間單位的行為與native
時間單位非常相似。也就是說,它在執行時重新啟動之間可能有所不同。若要取得此類型的值,請呼叫os:perf_counter/0
。deprecated_time_unit/0
- 為了向後相容性而保留的已棄用符號表示。
可以擴展 time_unit/0
類型。若要在時間單位之間轉換時間值,請使用 erlang:convert_time_unit/3
。
-type timestamp() :: {MegaSecs :: non_neg_integer(), Secs :: non_neg_integer(), MicroSecs :: non_neg_integer()}.
請參閱 erlang:timestamp/0
。
-type trace_flag() :: all | send | 'receive' | procs | ports | call | arity | return_to | silent | running | exiting | running_procs | running_ports | garbage_collection | timestamp | cpu_timestamp | monotonic_timestamp | strict_monotonic_timestamp | set_on_spawn | set_on_first_spawn | set_on_link | set_on_first_link | {tracer, pid() | port()} | {tracer, module(), term()}.
-type trace_info_flag() ::
send | 'receive' | set_on_spawn | call | return_to | procs | set_on_first_spawn |
set_on_link | running | garbage_collection | timestamp | monotonic_timestamp |
strict_monotonic_timestamp | arity.
-type trace_info_item_result() :: {traced, global | local | false | undefined} | {match_spec, trace_match_spec() | false | undefined} | {meta, pid() | port() | false | undefined | []} | {meta, module(), term()} | {meta_match_spec, trace_match_spec() | false | undefined} | {call_count, non_neg_integer() | boolean() | undefined} | {call_time | call_memory, [{pid(), non_neg_integer(), non_neg_integer(), non_neg_integer()}] | boolean() | undefined}.
-type trace_info_return() :: undefined | {flags, [trace_info_flag()]} | {tracer, pid() | port() | []} | {tracer, module(), term()} | trace_info_item_result() | {all, [trace_info_item_result()] | false | undefined}.
-type trace_match_spec() :: [{[term()] | '_' | match_variable(), [term()], [term()]}].
檢查總和
-spec adler32(Data) -> non_neg_integer() when Data :: iodata().
計算並返回 Data
的 adler32 校驗和。
-spec adler32(OldAdler, Data) -> non_neg_integer() when OldAdler :: non_neg_integer(), Data :: iodata().
透過將先前的校驗和 OldAdler
與 Data
的校驗和組合,繼續計算 adler32 校驗和。
以下程式碼
X = erlang:adler32(Data1),
Y = erlang:adler32(X,Data2).
將相同的值指派給 Y
,如下所示
Y = erlang:adler32([Data1,Data2]).
-spec adler32_combine(FirstAdler, SecondAdler, SecondSize) -> non_neg_integer() when FirstAdler :: non_neg_integer(), SecondAdler :: non_neg_integer(), SecondSize :: non_neg_integer().
組合兩個先前計算的 adler32 校驗和。
此計算要求已知第二個檢查總和的資料物件大小。
以下程式碼
Y = erlang:adler32(Data1),
Z = erlang:adler32(Y,Data2).
將相同的值指派給 Z
,如下所示
X = erlang:adler32(Data1),
Y = erlang:adler32(Data2),
Z = erlang:adler32_combine(X,Y,iolist_size(Data2)).
-spec crc32(Data) -> non_neg_integer() when Data :: iodata().
計算並返回 Data
的 crc32(IEEE 802.3 風格)校驗和。
-spec crc32(OldCrc, Data) -> non_neg_integer() when OldCrc :: non_neg_integer(), Data :: iodata().
透過將先前的校驗和 OldCrc
與 Data
的校驗和組合,繼續計算 crc32 校驗和。
以下程式碼
X = erlang:crc32(Data1),
Y = erlang:crc32(X,Data2).
將相同的值指派給 Y
,如下所示
Y = erlang:crc32([Data1,Data2]).
-spec crc32_combine(FirstCrc, SecondCrc, SecondSize) -> non_neg_integer() when FirstCrc :: non_neg_integer(), SecondCrc :: non_neg_integer(), SecondSize :: non_neg_integer().
組合兩個先前計算的 crc32 校驗和。
此計算要求已知第二個檢查總和的資料物件大小。
以下程式碼
Y = erlang:crc32(Data1),
Z = erlang:crc32(Y,Data2).
將相同的值指派給 Z
,如下所示
X = erlang:crc32(Data1),
Y = erlang:crc32(Data2),
Z = erlang:crc32_combine(X,Y,iolist_size(Data2)).
從 Data
計算 MD5 消息摘要,其中摘要的長度為 128 位元(16 個位元組)。Data
是二進制或小整數和二進制列表。
如需有關 MD5 的詳細資訊,請參閱 RFC 1321 - The MD5 Message-Digest Algorithm。
警告
MD5 訊息摘要演算法在程式碼簽署或軟體完整性用途方面並不被視為安全。
完成 MD5 Context
的更新,並返回計算的 MD5
消息摘要。
-spec md5_init() -> Context when Context :: binary().
建立 MD5 內容,用於後續的 md5_update/2
呼叫。
-spec md5_update(Context, Data) -> NewContext when Context :: binary(), Data :: iodata(), NewContext :: binary().
使用 Data
更新 MD5 Context
,並返回 NewContext
。
程式碼
如果 Module
有舊程式碼,則返回 true
,否則返回 false
。
另請參閱 code
。
-spec check_process_code(Pid, Module, OptionList) -> CheckResult | async when Pid :: pid(), Module :: module(), RequestId :: term(), Option :: {async, RequestId} | {allow_gc, boolean()}, OptionList :: [Option], CheckResult :: boolean() | aborted.
檢查由 Pid
識別的節點本地程序是否為 Module
執行舊程式碼。
Option
選項
{allow_gc, boolean()}
- 決定執行操作時是否允許垃圾回收。如果傳遞了{allow_gc, false}
,並且需要垃圾回收才能確定操作的結果,則操作會中止 (請參閱下方關於CheckResult
的資訊)。預設是允許垃圾回收,也就是{allow_gc, true}
。{async, RequestId}
- 函數check_process_code/3
在請求傳送後立即傳回值async
。當請求處理完成時,呼叫此函數的程序會收到一個格式為{check_process_code, RequestId, CheckResult}
的訊息。
如果 Pid
等於 self/0
,且沒有傳遞 async
選項,則會立即執行操作。否則,會將操作請求傳送到由 Pid
識別的程序,並在適當時處理。如果沒有傳遞 async
選項,則呼叫者會封鎖直到 CheckResult
可用並可傳回。
CheckResult
會告知請求的結果,如下所示
true
- 由Pid
識別的程序為Module
執行舊程式碼。也就是說,程序的目前呼叫會針對此模組執行舊程式碼,或程序具有對此模組舊程式碼的參考,或程序包含參考此模組舊程式碼的函式。false
- 由Pid
識別的程序不為Module
執行舊程式碼。aborted
- 操作已中止,因為程序需要進行垃圾回收才能確定操作結果,而該操作是透過傳遞選項{allow_gc, false}
來請求的。
變更
在 ERTS 8.* 版之前,檢查程序程式碼操作會檢查對舊程式碼的所有類型參考。也就是說,直接參考 (例如,程序堆疊上的返回位址)、間接參考 (程序上下文中的
fun
) 以及程式碼中對常值的參考。從 ERTS 9.0 版開始,檢查程序程式碼操作僅檢查對程式碼的直接參考。將會忽略透過
fun
的間接參考。如果存在這類fun
,並且在清除舊程式碼後使用,則會在使用時引發例外狀況 (與清除後程序收到fun
的情況相同)。常值將會在稍後階段處理 (複製)。從 ERTS 8.1 版開始,當建置 OTP時可以啟用此行為,如果啟用 dirty 排程器支援,則會自動啟用此行為。
另請參閱 code
。
失敗
badarg
- 如果Pid
不是節點本機程序識別符。badarg
- 如果Module
不是一個原子。badarg
- 如果OptionList
是一個無效的選項列表。
-spec delete_module(Module) -> true | undefined when Module :: module().
使 Module
的當前程式碼成為舊程式碼,並從匯出表中刪除此模組的所有參考。如果模組不存在,則返回 undefined
,否則返回 true
。
警告
這個 BIF 是為程式碼伺服器 (請參閱
code
) 而設計的,不應在其他地方使用。
失敗: 如果 Module
已經存在舊版本,則為 badarg
。
-spec function_exported(Module, Function, Arity) -> boolean() when Module :: module(), Function :: atom(), Arity :: arity().
如果模組 Module
為當前,並且包含一個匯出的函式 Function/Arity
,則返回 true
;或者如果存在具有指定名稱的 BIF(以 C 實作的內建函式),則返回 true
,否則返回 false
。
-spec is_builtin(Module, Function, Arity) -> boolean() when Module :: module(), Function :: atom(), Arity :: arity().
這個 BIF 對於建立交叉參考工具很有用。
如果 Module:Function/Arity
是一個以 C 實作的 BIF,則返回 true
,否則返回 false
。
-spec load_module(Module, Binary) -> {module, Module} | {error, Reason} when Module :: module(), Binary :: binary(), Reason :: badfile | not_purged | on_load | {features_not_allowed, [atom()]}.
載入由 Binary
中包含的物件程式碼描述的 Module
。
如果模組 Module
的程式碼已經存在,則會替換所有匯出參考,使其指向新載入的程式碼。先前載入的程式碼會保留在系統中作為舊程式碼,因為可能仍有程序正在執行該程式碼。
如果載入失敗,則返回 {module, Module}
或 {error, Reason}
。Reason
是以下其中之一:
badfile
-Binary
中的目標程式碼格式不正確,或目標程式碼包含與Module
不同的模組的程式碼。not_purged
-Binary
包含一個無法載入的模組,因為此模組的舊程式碼已存在。on_load
-Binary
中的程式碼包含一個on_load
宣告,該宣告必須在Binary
成為目前程式碼之前執行。在on_load
呼叫完成之前,Module
的任何先前的目前程式碼都將保持不變。not_allowed -
Binary
中的程式碼是使用目前在執行階段系統中未啟用的功能編譯的。
警告
這個 BIF 是為程式碼伺服器 (請參閱
code
) 而設計的,不應在其他地方使用。
-spec load_nif(Path, LoadInfo) -> ok | Error when Path :: string(), LoadInfo :: term(), Error :: {error, {Reason, Text :: string()}}, Reason :: load_failed | bad_lib | load | reload | upgrade | old_code.
載入並連結一個動態函式庫,其中包含模組的原生實作函式 (NIF)。
Path
是可共享物件/動態連結庫檔案的檔案路徑,不包含與作業系統相關的檔案副檔名(Unix 為 .so
,Windows 為 .dll
)。請注意,在大多數作業系統上,當 NIF 升級完成時,程式庫在磁碟上的名稱必須不同。如果名稱相同,但內容不同,則可能會載入舊的程式庫。有關如何實作 NIF 程式庫的資訊,請參閱 erl_nif(3)
。
LoadInfo
可以是任何 term。它會作為初始化的一部分傳遞到程式庫。一個好的做法是包含模組版本號,以支援未來的程式碼升級場景。
對 load_nif/2
的呼叫必須直接從 NIF 程式庫所屬的模組的 Erlang 程式碼中發出。如果載入失敗,則返回 ok
或 {error,{Reason,Text}}
。Reason
是以下原子之一,而 Text
是一個人類可讀的字串,可以提供有關失敗的更多資訊:
load_failed
- 作業系統無法載入 NIF 程式庫。bad_lib
- 程式庫不符合呼叫模組作為 NIF 程式庫的要求。load | upgrade
- 相應的程式庫回呼失敗。reload
- 此模組實例已載入 NIF 程式庫。先前已棄用的reload
功能已在 OTP 20 中移除。old_code
- 對load_nif/2
的呼叫是從已升級的模組的舊程式碼中發出的;這是不可允許的。
如果使用 -nifs()
屬性(建議使用),則動態連結庫中的所有 NIF 都必須宣告為這樣,load_nif/2
才能成功。另一方面,使用 -nifs()
屬性宣告的所有函式都不必由動態連結庫實作。這允許與目標無關的 Erlang 檔案包含函式的後備實作,這些函式可能因目標作業系統/硬體平台而缺少 NIF 支援。
-spec loaded() -> [Module] when Module :: module().
傳回所有已載入的 Erlang 模組(當前和舊程式碼),包括預先載入的模組。
另請參閱 code
。
如果模組 Module
以當前程式碼載入,則返回 true
;否則返回 false
。它不會嘗試載入模組。
-spec pre_loaded() -> [module()].
傳回執行時系統中預先載入的 Erlang 模組清單。
預先載入的模組是 Erlang 模組,這些模組是從磁碟載入第一個 Erlang 模組或使用 erl_boot_server
來啟動系統所需的。
-spec purge_module(Module) -> true when Module :: atom().
移除 Module
的舊程式碼。在使用此 BIF 之前,必須呼叫 check_process_code/2
以檢查是否有任何程序在模組中執行舊程式碼。
警告
這個 BIF 是為程式碼伺服器 (請參閱
code
) 而設計的,不應在其他地方使用。
變更
從 ERTS 8.0 (Erlang/OTP 19) 開始,此函式會終止仍執行舊程式碼的任何持久程序。在較早的版本中,此類不正確的使用可能會導致更嚴重的失敗,例如模擬器崩潰。
失敗:如果 Module
沒有舊程式碼,則為 badarg
。
分散式 Erlang
強制斷開節點的連線。
這樣做會使節點 Node
看起來像是本機節點已崩潰。這個 BIF 主要用於 Erlang 網路驗證協定。
如果中斷連線成功,則返回 true
,否則返回 false
。如果本機節點未處於活動狀態,則返回 ignored
。
注意
此函式可能會在傳遞
nodedown
訊息之前返回。
-spec dist_ctrl_get_data(DHandle) -> {Size, Data} | Data | none when Size :: non_neg_integer(), DHandle :: dist_handle(), Data :: iovec().
從本機節點取得要傳遞至遠端節點的分散式通道資料。
分發通道由 DHandle
識別。如果沒有可用資料,則返回原子 none
。可以透過呼叫 erlang:dist_ctrl_get_data_notification(DHandle)
來請求在更多資料可用時收到訊息通知。
當有資料可用時返回的值取決於由 DHandle
識別的分發通道上設定的 get_size
選項的值。如需更多資訊,請參閱 erlang:dist_ctrl_set_opt/3
函式的 get_size
選項的文件。
注意
只有註冊為由
DHandle
識別的分發通道的分發控制器的程序才允許呼叫此函式。
此函式用於使用程序作為分發控制器來實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec dist_ctrl_get_data_notification(DHandle) -> ok when DHandle :: dist_handle().
請求當有更多資料可以使用 erlang:dist_ctrl_get_data(DHandle)
來提取時,針對由 DHandle
識別的分散式通道進行通知。
當存在更多資料時,呼叫者將收到訊息 dist_data
。一旦傳送 dist_data
訊息,在再次呼叫 dist_ctrl_get_data_notification/1
函式之前,將不再傳送 dist_data
訊息。
注意
只有註冊為由
DHandle
識別的分發通道的分發控制器的程序才允許呼叫此函式。
此函式用於使用程序作為分發控制器來實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec dist_ctrl_get_opt(DHandle, get_size) -> Value when DHandle :: dist_handle(), Value :: boolean().
傳回由 DHandle
識別的分散式通道上 get_size
選項的值。如需詳細資訊,請參閱 erlang:dist_ctrl_set_opt/3
函式的 get_size
選項的文件。
注意
只有註冊為由
DHandle
識別的分發通道的分發控制器的程序才允許呼叫此函式。
此函式用於使用程序作為分發控制器來實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec dist_ctrl_input_handler(DHandle, InputHandler) -> ok when DHandle :: dist_handle(), InputHandler :: pid().
為由 DHandle
識別的分散式通道註冊替代的輸入處理程序。
一旦呼叫此函式,InputHandler
是唯一允許使用識別此分發通道的 DHandle
呼叫 erlang:dist_ctrl_put_data(DHandle, Data)
的程序。
注意
當由
DHandle
識別的分發通道的分發控制器是程序時,它是唯一允許呼叫此函式的程序。當由DHandle
識別的分發通道的分發控制器是埠時,也允許呼叫此函式。在這種情況下,埠接收到的資料應傳遞到由InputHandler
識別的程序,該程序應進而呼叫erlang:dist_ctrl_put_data/2
。
此函式用於實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec dist_ctrl_put_data(DHandle, Data) -> ok when DHandle :: dist_handle(), Data :: iodata().
將分散式通道資料從遠端節點傳送到本機節點。
注意
只有註冊為由
DHandle
識別的發佈通道的發佈控制器的程序,才允許呼叫此函數,除非已使用erlang:dist_ctrl_input_handler(DHandle, InputHandler)
註冊了替代的輸入處理程序。如果已註冊替代的輸入處理程序,則只有註冊的輸入處理程序才允許呼叫此函數。
此函式用於實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec dist_ctrl_set_opt(DHandle, get_size, Value) -> OldValue when DHandle :: dist_handle(), Value :: boolean(), OldValue :: boolean().
設定由 DHandle
識別的分散式通道上 get_size
選項的值。
此選項控制對 erlang:dist_ctrl_get_data(DHandle) 的呼叫的傳回值,其中 DHandle
等於設定此選項時使用的 DHandle
。當 get_size
選項為
false
- 且有可用的發佈資料時,呼叫erlang:dist_ctrl_get_data(DHandle)
只會傳回Data
以便在通道上傳遞。這是get_size
選項的預設值。true
- 且有可用的發佈資料時,呼叫erlang:dist_ctrl_get_data(DHandle)
將傳回Data
以便在通道上傳遞,以及Data
的Size
(以位元組為單位)。這會以{Size, Data}
形式的元組傳回。
當通道關閉時,所有選項都會設定為預設值。
注意
只有註冊為由
DHandle
識別的分發通道的分發控制器的程序才允許呼叫此函式。
此函式用於使用程序作為分發控制器來實作替代分發載體。DHandle
是透過回呼 f_handshake_complete
檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。
-spec get_cookie() -> Cookie | nocookie when Cookie :: atom().
如果本機節點處於活動狀態,則傳回本機節點的魔術 Cookie,否則傳回原子 nocookie
。此值由 set_cookie/1
設定。
如果本機節點處於活動狀態,則傳回節點 Node
的魔術 Cookie,否則傳回原子 nocookie
。此值由 set_cookie/2
設定。
-spec is_alive() -> boolean().
如果本機節點處於活動狀態(也就是說,如果節點可以成為分散式系統的一部分),則返回 true
,否則返回 false
。如果節點是以
如果節點已透過呼叫 net_kernel:start/2
取得名稱,且尚未透過呼叫 net_kernel:stop/0
停止,則該節點也可以是活動的。
監控節點 Node
的狀態。如果 Flag
為 true
,則開啟監控。如果 Flag
為 false
,則關閉監控。
對同一個 Node
多次呼叫 monitor_node(Node, true)
並非錯誤;這會產生許多獨立的監控執行個體。
如果 Node
失敗或不存在,訊息 {nodedown, Node}
會傳遞至程序。如果程序對 monitor_node(Node, true)
進行了兩次呼叫,且 Node
終止,則會將兩個 nodedown
訊息傳遞至該程序。如果沒有與 Node
的連線,則會嘗試建立連線。如果失敗,則會傳遞 nodedown
訊息。
nodedown
訊號的傳遞順序與來自關閉節點的其他連結或監控訊號無關。如果您需要保證在傳送 nodedown
訊號之前,已傳遞來自遠端節點的所有訊號,您應該使用 net_kernel:monitor_nodes/1
。
透過隱藏連線連線的節點可以像任何其他節點一樣受到監控。
失敗:如果本機節點未活動,則為 notalive
。
-spec monitor_node(Node, Flag, Options) -> true when Node :: node(), Flag :: boolean(), Options :: [Option], Option :: allow_passive_connect.
行為如同 monitor_node/2
,不同之處在於它允許指定一個額外的選項,即 allow_passive_connect
。
即使無法從此節點主動連線 (也就是說,它被封鎖),此選項也允許 BIF 等待 受監控節點 連接自身的正常網路連線逾時。只有使用 Kernel 選項 dist_auto_connect once
才能達成這種有用的狀態。如果未使用該選項,則選項 allow_passive_connect
無效。
注意
選項
allow_passive_connect
在內部使用,在網路拓撲和有效 Kernel 選項事先已知的情況下,很少在應用程式中需要。
失敗:如果本機節點未活動或選項清單格式錯誤,則為 badarg
。
-spec node() -> Node when Node :: node().
傳回本機節點的名稱。如果節點未處於活動狀態,則改為傳回 nonode@nohost
。
-spec nodes() -> Nodes when Nodes :: [node()].
傳回透過正常連線連線至此節點的所有節點清單(也就是說,不會列出隱藏節點)。與 nodes(visible) 相同。
-spec nodes(Arg) -> Nodes when Arg :: NodeType | [NodeType], NodeType :: visible | hidden | connected | this | known, Nodes :: [node()].
根據指定的引數傳回節點清單。當引數為清單時,傳回的結果是符合清單元素析取的節點清單。
NodeType
visible
- 透過一般連線連線到此節點的節點。hidden
- 透過隱藏連線連線到此節點的節點。connected
- 連線到此節點的所有節點。this
- 此節點。known
- 此節點已知的節點。也就是說,連線的節點以及此節點上的程序識別碼、埠識別碼和參照所參照的節點。已知節點的集合會進行垃圾收集。請注意,此垃圾收集可能會延遲。如需詳細資訊,請參閱erlang:system_info(delayed_node_table_gc)
。
一些等式:[node()] = nodes(this)
、nodes(connected) = nodes([visible, hidden])
和 nodes() = nodes(visible)
。
-spec nodes(Arg, InfoOpts) -> [NodeInfo] when NodeType :: visible | hidden | connected | this | known, Arg :: NodeType | [NodeType], InfoOpts :: #{connection_id => boolean(), node_type => boolean()}, NodeTypeInfo :: visible | hidden | this | known, ConnectionId :: undefined | integer(), Info :: #{connection_id => ConnectionId, node_type => NodeTypeInfo}, NodeInfo :: {node(), Info}.
傳回 NodeInfo
元組的清單。
第一個元素是節點名稱。要包含在清單中的節點是由第一個引數 Arg
決定,其方式與 nodes(Arg)
相同。NodeInfo
元組的第二個元素是包含有關第一個元素所識別節點的進一步資訊的對應。此對應中存在的資訊是由作為第二個引數傳遞的 InfoOpts
對應決定。目前,允許在 InfoOpts
對應中使用以下關聯
connection_id => boolean()
- 如果關聯的值等於true
,則傳回結果中的Info
對應將包含與值ConnectionId
相關聯的索引鍵connection_id
。如果ConnectionId
等於undefined
,則節點未連線到呼叫端正在其上執行的節點,或是呼叫端正在其上執行的節點。如果ConnectionId
是整數,則節點目前已連線到呼叫端正在其上執行的節點。整數連線識別碼值與節點名稱共同識別與該節點名稱的節點的特定連線執行個體。連線識別碼值是節點本機值。也就是說,在另一個節點上,連線識別碼將不會是相同的值。如果關閉連線然後再次建立連線,則該連線的連線識別碼值將會變更。連線識別碼的值數量有限,因此可能會看到不同執行個體的相同值,但可能性很小。未定義兩個連續連線執行個體之間值的變更方式。
node_type => boolean()
- 如果關聯的值等於true
,則傳回結果中的Info
對應將包含與值NodeTypeInfo
相關聯的索引鍵node_type
。目前,存在以下節點類型
範例
(a@localhost)1> nodes([this, connected], #{connection_id=>true, node_type=>true}).
[{c@localhost,#{connection_id => 13892108,node_type => hidden}},
{b@localhost,#{connection_id => 3067553,node_type => visible}},
{a@localhost,#{connection_id => undefined,node_type => this}}]
(a@localhost)2>
-spec set_cookie(Cookie) -> true when Cookie :: atom().
將本機節點的魔術 Cookie 設定為原子 Cookie
,該原子也是所有沒有使用 set_cookie/2
設定明確 Cookie 的節點的 Cookie Cookie
。
如需更多資訊,請參閱系統文件中 Erlang 參考手冊中的「分散式 Erlang」章節。
您可以使用 get_cookie/0
取得此值。
失敗:如果本機節點未活動,則為 function_clause
。
將 Node
的魔術 Cookie 設定為原子 Cookie
。如果 Node
是本機節點,則該函式會將所有其他節點(沒有使用此函式設定明確 Cookie 的節點)的 Cookie 設定為 Cookie
。
如需更多資訊,請參閱系統文件中 Erlang 參考手冊中的「分散式 Erlang」章節。
您可以使用 get_cookie/1
取得此值。
失敗:如果本機節點未活動,則為 function_clause
。
Erlang 術語
-spec abs(Float) -> float() when Float :: float(); (Int) -> non_neg_integer() when Int :: integer().
傳回一個整數或浮點數,該整數或浮點數是 Float
或 Int
的算術絕對值。
例如
> abs(-3.33).
3.33
> abs(-3).
3
-spec append_element(Tuple1, Term) -> Tuple2 when Tuple1 :: tuple(), Tuple2 :: tuple(), Term :: term().
傳回一個新的元組,該元組比 Tuple1
多一個元素,並且包含 Tuple1
中的元素,後面接著 Term
作為最後一個元素。
語義上等效於 list_to_tuple(tuple_to_list(Tuple1) ++ [Term])
,但速度快得多。
例如
> erlang:append_element({one, two}, three).
{one,two,three}
-spec atom_to_binary(Atom, Encoding) -> binary() when Atom :: atom(), Encoding :: latin1 | unicode | utf8.
傳回對應於 Atom
的文字表示形式的二進位。
如果 Encoding
是 latin1
,則文字表示中的每個字元會佔用一個位元組。如果 Encoding
是 utf8
或 unicode
,則字元會使用 UTF-8 編碼,其中字元可能需要多個位元組。
變更
從 Erlang/OTP 20 開始,原子 (atom) 可以包含任何 Unicode 字元,並且如果
Atom
的文字表示包含 Unicode 字元 > 255,則atom_to_binary(Atom, latin1)
可能會失敗。
範例
> atom_to_binary('Erlang', latin1).
<<"Erlang">>
傳回對應於 Atom
的文字表示形式的 Unicode 程式碼點清單。
例如
> atom_to_list('Erlang').
"Erlang"
> atom_to_list('你好').
[20320,22909]
關於如何將產生的列表轉換為不同的格式,請參閱 unicode
。
-spec binary_part(Subject, PosLen) -> binary() when Subject :: binary(), PosLen :: {Start :: non_neg_integer(), Length :: integer()}.
提取由 PosLen
描述的二進位部分。
可以使用負數長度來提取二進制資料末尾的位元組。
例如
1> Bin = <<1,2,3,4,5,6,7,8,9,10>>.
2> binary_part(Bin,{byte_size(Bin), -5}).
<<6,7,8,9,10>>
失敗:如果 PosLen
以任何方式參考到二進制資料外部,則會發生 badarg
錯誤。
Start
是從零開始的索引,也就是說
1> Bin = <<1,2,3>>
2> binary_part(Bin,{0,2}).
<<1,2>>
關於 PosLen
語意的詳細資訊,請參閱 binary
。
-spec binary_part(Subject, Start, Length) -> binary() when Subject :: binary(), Start :: non_neg_integer(), Length :: integer().
-spec binary_to_atom(Binary, Encoding) -> atom() when Binary :: binary(), Encoding :: latin1 | unicode | utf8.
傳回文字表示形式為 Binary
的原子。如果 Encoding
為 utf8
或 unicode
,則二進位必須包含有效的 UTF-8 序列。
變更
從 Erlang/OTP 20 開始,
binary_to_atom(Binary, utf8)
能夠解碼任何 Unicode 字元。較早的版本如果二進制資料包含 Unicode 字元 > 255,則會失敗。
注意
原子名稱中允許的字元數量是有限制的。預設限制可以在 效率指南 (系統限制章節) 中找到。
注意
可以存在的原子數量有可設定的限制,而且原子不會被垃圾回收。因此,建議考慮
binary_to_existing_atom/2
是否比binary_to_atom/2
更好的選擇。預設限制可以在 效率指南 (系統限制章節) 中找到。
範例
> binary_to_atom(<<"Erlang">>, latin1).
'Erlang'
> binary_to_atom(<<1024/utf8>>, utf8).
'Ѐ'
-spec binary_to_existing_atom(Binary, Encoding) -> atom() when Binary :: binary(), Encoding :: latin1 | unicode | utf8.
與 binary_to_atom/2
相同,但原子必須存在。
Erlang 系統對於可以存在的原子總數有可設定的限制,而且原子不會被垃圾回收。因此,從來自不受信任來源(例如,從網際網路擷取的文件)的二進制資料建立許多原子是不安全的,例如使用 binary_to_atom/2
。因此,當輸入二進制資料來自不受信任的來源時,此函數是合適的選擇。
當原子包含在已載入的 Erlang 模組中,或以程式方式建立時(例如,通過 binary_to_atom/2
),原子會存在於 Erlang 系統中。請參閱下一個註解,了解一個範例,說明原子在 Erlang 模組的原始程式碼中存在,但不在相同模組的編譯版本中。
失敗:如果原子不存在,則會發生 badarg
錯誤。
注意
請注意,編譯器可能會最佳化掉原子。例如,編譯器會將
atom_to_list(some_atom)
重寫為"some_atom"
。如果該表示式是包含模組中唯一提及的原子some_atom
,則在載入模組時不會建立該原子,並且後續呼叫binary_to_existing_atom(<<"some_atom">>, utf8)
將會失敗。
注意
原子名稱中允許的字元數量是有限制的。預設限制可以在 效率指南 (系統限制章節) 中找到。
傳回文字表示形式為 Binary
的浮點數。
例如
> binary_to_float(<<"2.2017764e+0">>).
2.2017764
浮點數的字串格式與 Erlang 浮點數文字的格式相同,但底線符號不允許使用。
失敗:如果 Binary
包含錯誤的浮點數表示法,則會發生 badarg
錯誤。
傳回文字表示形式為 Binary
的整數。
例如
> binary_to_integer(<<"123">>).
123
binary_to_integer/1
接受與 list_to_integer/1
相同的字串格式。
失敗:如果 Binary
包含錯誤的整數表示法,則會發生 badarg
錯誤。
傳回以 Base
為底的文字表示形式為 Binary
的整數。
例如
> binary_to_integer(<<"3FF">>, 16).
1023
binary_to_integer/2
接受與 list_to_integer/2
相同的字串格式。
失敗:如果 Binary
包含錯誤的整數表示法,則會發生 badarg
錯誤。
傳回對應於 Binary
的位元組的整數清單。
-spec binary_to_list(Binary, Start, Stop) -> [byte()] when Binary :: binary(), Start :: pos_integer(), Stop :: pos_integer().
與 binary_to_list/1
相同,但傳回一個對應於 Binary
中從位置 Start
到位置 Stop
的位元組的整數清單。二進位中的位置從 1 開始編號。
注意
這個函數使用的二進制資料的一基索引 (one-based indexing) 已被棄用。 新的程式碼應改用 STDLIB 中的
binary:bin_to_list/3
。模組binary
中的所有函數都一致地使用從零開始的索引 (zero-based indexing)。
-spec binary_to_term(Binary) -> term() when Binary :: ext_binary().
傳回 Erlang 項,該項是解碼二進位物件 Binary
的結果,該物件必須根據 Erlang 外部項格式進行編碼。
> Bin = term_to_binary(hello).
<<131,100,0,5,104,101,108,108,111>>
> hello = binary_to_term(Bin).
hello
警告
當解碼來自不受信任來源的二進制資料時,不受信任的來源可能會以建立無法被垃圾回收且導致阻斷服務攻擊的資源(例如,原子和遠端參考)的方式提交資料。在這種情況下,請考慮使用具有
safe
選項的binary_to_term/2
。
另請參閱 term_to_binary/1
和 binary_to_term/2
。
-spec binary_to_term(Binary, Opts) -> term() | {term(), Used} when Binary :: ext_binary(), Opt :: safe | used, Opts :: [Opt], Used :: pos_integer().
等效於 binary_to_term(Binary)
,但可以設定為適合特殊用途。
允許的選項如下:
safe
- 當接收來自不受信任來源的二進制資料時,請使用此選項。啟用後,它會阻止解碼可用於攻擊 Erlang 執行時的資料。如果收到不安全的資料,解碼會失敗並產生
badarg
錯誤。這會直接阻止建立新的原子,間接阻止建立新的原子(因為它們嵌入在某些結構中,例如處理程序識別碼、refs 和 funs),並阻止建立新的外部函數參考。這些資源都不會被垃圾回收,因此未經檢查地建立它們可能會耗盡可用記憶體。
> binary_to_term(<<131,100,0,5,"hello">>, [safe]). ** exception error: bad argument > hello. hello > binary_to_term(<<131,100,0,5,"hello">>, [safe]). hello
警告
safe
選項可確保 Erlang 執行時安全地處理資料,但它不保證資料對您的應用程式安全。您必須始終驗證來自不受信任來源的資料。如果二進制資料被儲存或通過不受信任的來源傳輸,您也應該考慮對其進行密碼簽署。used
- 將回傳值變更為{Term, Used}
,其中Used
是實際從Binary
讀取的位元組數。> Input = <<131,100,0,5,"hello","world">>. <<131,100,0,5,104,101,108,108,111,119,111,114,108,100>> > {Term, Used} = binary_to_term(Input, [used]). {hello, 9} > split_binary(Input, Used). {<<131,100,0,5,104,101,108,108,111>>, <<"world">>}
失敗:如果指定了 safe
並且解碼了不安全的資料,則會發生 badarg
錯誤。
另請參閱 term_to_binary/1
、binary_to_term/1
和 list_to_existing_atom/1
。
-spec bit_size(Bitstring) -> non_neg_integer() when Bitstring :: bitstring().
傳回一個整數,該整數是 Bitstring
的位元大小。
例如
> bit_size(<<433:16,3:3>>).
19
> bit_size(<<1,2,3>>).
24
傳回對應於 Bitstring
的位元組的整數清單。
如果二進制資料中的位元數不能被 8 整除,則列表的最後一個元素是一個包含剩餘 1-7 位元的位元字串。
例如
> bitstring_to_list(<<433:16>>).
[1,177]
> bitstring_to_list(<<433:16,3:3>>).
[1,177,<<3:3>>]
-spec byte_size(Bitstring) -> non_neg_integer() when Bitstring :: bitstring().
傳回一個整數,該整數是包含 Bitstring
所需的位元組數。也就是說,如果 Bitstring
中的位元數不能被 8 整除,則產生的位元組數會向上捨入。
例如
> byte_size(<<433:16,3:3>>).
3
> byte_size(<<1,2,3>>).
3
傳回不小於 Number
的最小整數。
例如
> ceil(5.5).
6
-spec decode_packet(Type, Bin, Options) -> {ok, Packet, Rest} | {more, Length} | {error, Reason} when Type :: raw | 0 | 1 | 2 | 4 | asn1 | cdr | sunrm | fcgi | tpkt | line | http | http_bin | httph | httph_bin, Bin :: binary(), Options :: [Opt], Opt :: {packet_size, non_neg_integer()} | {line_length, non_neg_integer()}, Packet :: binary() | HttpPacket, Rest :: binary(), Length :: non_neg_integer() | undefined, Reason :: term(), HttpPacket :: HttpRequest | HttpResponse | HttpHeader | http_eoh | HttpError, HttpRequest :: {http_request, HttpMethod, HttpUri, HttpVersion}, HttpResponse :: {http_response, HttpVersion, integer(), HttpString}, HttpHeader :: {http_header, integer(), HttpField, UnmodifiedField :: HttpString, Value :: HttpString}, HttpError :: {http_error, HttpString}, HttpMethod :: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | HttpString, HttpUri :: '*' | {absoluteURI, http | https, Host :: HttpString, Port :: inet:port_number() | undefined, Path :: HttpString} | {scheme, Scheme :: HttpString, HttpString} | {abs_path, HttpString} | HttpString, HttpVersion :: {Major :: non_neg_integer(), Minor :: non_neg_integer()}, HttpField :: 'Cache-Control' | 'Connection' | 'Date' | 'Pragma' | 'Transfer-Encoding' | 'Upgrade' | 'Via' | 'Accept' | 'Accept-Charset' | 'Accept-Encoding' | 'Accept-Language' | 'Authorization' | 'From' | 'Host' | 'If-Modified-Since' | 'If-Match' | 'If-None-Match' | 'If-Range' | 'If-Unmodified-Since' | 'Max-Forwards' | 'Proxy-Authorization' | 'Range' | 'Referer' | 'User-Agent' | 'Age' | 'Location' | 'Proxy-Authenticate' | 'Public' | 'Retry-After' | 'Server' | 'Vary' | 'Warning' | 'Www-Authenticate' | 'Allow' | 'Content-Base' | 'Content-Encoding' | 'Content-Language' | 'Content-Length' | 'Content-Location' | 'Content-Md5' | 'Content-Range' | 'Content-Type' | 'Etag' | 'Expires' | 'Last-Modified' | 'Accept-Ranges' | 'Set-Cookie' | 'Set-Cookie2' | 'X-Forwarded-For' | 'Cookie' | 'Keep-Alive' | 'Proxy-Connection' | HttpString, HttpString :: string() | binary().
根據 Type
指定的封包協定解碼二進位 Bin
。與具有選項 {packet,Type}
的 Socket 所做的封包處理類似。
如果整個封包都包含在 Bin
中,則會連同二進制資料的剩餘部分一起以 {ok,Packet,Rest}
的形式傳回。
如果 Bin
不包含整個封包,則會傳回 {more,Length}
。Length
要么是封包的預期總大小,要么是 undefined
(如果預期封包大小未知)。然後可以使用添加的更多資料再次呼叫 decode_packet
。
如果封包不符合協定格式,則會傳回 {error,Reason}
。
Type
類型
raw | 0
- 不執行封包處理。除非二進制資料為空,否則會傳回整個二進制資料。1 | 2 | 4
- 封包由指定封包位元組數的標頭組成,後面跟著該位元組數。標頭的長度可以是一個、兩個或四個位元組;位元組的順序是大端序 (big-endian)。當封包傳回時,標頭會被移除。line
- 封包是以分隔符號位元組終止的行,預設是 latin-1 換行字元。分隔符號位元組包含在傳回的封包中,除非該行根據選項line_length
被截斷。asn1 | cdr | sunrm | fcgi | tpkt
- 標頭不會被移除。封包類型的含義如下:
asn1
- ASN.1 BERsunrm
- Sun 的 RPC 編碼cdr
- CORBA (GIOP 1.1)fcgi
- Fast CGItpkt
- TPKT 格式 [RFC1006]
http | httph | http_bin | httph_bin
- 超文本傳輸協定。封包會根據先前描述的HttpPacket
格式傳回。封包可以是請求、回應、標頭或標頭結束標記。無效的行會以HttpError
傳回。已識別的請求方法和標頭欄位會以原子形式傳回。其他則以字串形式傳回。無法識別的標頭欄位字串會格式化為僅第一個字母和大寫,以及連字號後面的字母,例如
"Sec-Websocket-Key"
。標頭欄位名稱也會以字串形式在UnmodifiedField
中傳回,不經任何轉換或格式化。當預期為
HttpRequest
或HttpResponse
時,協定類型http
僅用於第一行。後續的呼叫應使用httph
來取得HttpHeader
,直到傳回http_eoh
為止,這表示標頭的結束和任何後續訊息主體的開始。變體
http_bin
和httph_bin
會以二進位形式傳回字串 (HttpString
),而不是列表。自 OTP 26.0 起,
Host
可以是用[]
括起來的 IPv6 位址,如 RFC2732 中所定義。
選項
{packet_size, integer() >= 0}
- 設定封包主體允許的最大大小。如果封包標頭指示封包的長度大於允許的最大長度,則該封包會被視為無效。預設值為 0,表示沒有大小限制。{line_length, integer() >= 0}
- 對於封包類型line
,超過指定長度的行會被截斷。如果沒有設定
packet_size
本身,選項line_length
也會作為選項packet_size
的別名,套用於http*
封包類型。此用法僅用於向後相容性。{line_delimiter, 0 =< byte() =< 255}
- 對於封包類型line
,設定分隔位元組。預設值為 latin-1 字元$\n
。
範例
> erlang:decode_packet(1,<<3,"abcd">>,[]).
{ok,<<"abc">>,<<"d">>}
> erlang:decode_packet(1,<<5,"abcd">>,[]).
{more,6}
-spec delete_element(Index, Tuple1) -> Tuple2 when Index :: pos_integer(), Tuple1 :: tuple(), Tuple2 :: tuple().
傳回一個新的元組,其中元素在元組 Tuple1
中移除 Index
的位置。
例如
> erlang:delete_element(2, {one, two, three}).
{one,three}
-spec display(Term) -> true when Term :: term().
在標準輸出上印出 Term
的文字表示形式。
警告
此 BIF 僅用於除錯。列印的表示形式可能包含不符合 Erlang 中術語高階表示形式的內部詳細資訊。
-spec element(N, Tuple) -> term() when N :: pos_integer(), Tuple :: tuple().
傳回 Tuple
的第 N
個元素(從 1 開始編號)。
例如
> element(2, {a, b, c}).
b
-spec external_size(Term) -> non_neg_integer() when Term :: term().
計算以 Erlang 外部項格式編碼的項目的最大位元組大小,而無需執行編碼。
以下條件始終適用
> Size1 = byte_size(term_to_binary(Term)),
> Size2 = erlang:external_size(Term),
> true = Size1 =< Size2.
true
這等同於呼叫
erlang:external_size(Term, [])
-spec external_size(Term, Options) -> non_neg_integer() when Term :: term(), Options :: [compressed | {compressed, Level :: 0..9} | deterministic | {minor_version, Version :: 0..2} | local].
計算以 Erlang 外部項格式編碼的項目的最大位元組大小,而無需執行編碼。
以下條件始終適用
> Size1 = byte_size(term_to_binary(Term, Options)),
> Size2 = erlang:external_size(Term, Options),
> true = Size1 =< Size2.
true
選項 {minor_version, Version}
指定浮點數的編碼方式。有關詳細描述,請參閱 term_to_binary/2
。
透過將 Number
轉換為浮點數來傳回浮點數。
例如
> float(55).
55.0
注意
如果在 guard 的最上層使用,它會測試參數是否為浮點數;為了清楚起見,請改用
is_float/1
。當在 guard 中的表達式中使用
float/1
時,例如 'float(A) == 4.0
',它會如先前所述轉換數字。
-spec float_to_binary(Float, Options) -> binary() when Float :: float(), Options :: [Option], Option :: {decimals, Decimals :: 0..253} | {scientific, Decimals :: 0..249} | compact | short.
傳回一個對應於使用固定小數點格式的 Float
的文字表示形式的二進位。
Options
的行為方式與 float_to_list/2
相同。
例如
> float_to_binary(7.12, [{decimals, 4}]).
<<"7.1200">>
> float_to_binary(7.12, [{decimals, 4}, compact]).
<<"7.12">>
> float_to_binary(7.12, [{scientific, 3}]).
<<"7.120e+00">>
> float_to_binary(7.12, [short]).
<<"7.12">>
> float_to_binary(0.1+0.2, [short]).
<<"0.30000000000000004">>
> float_to_binary(0.1+0.2)
<<"3.00000000000000044409e-01">>
-spec float_to_list(Float, Options) -> string() when Float :: float(), Options :: [Option], Option :: {decimals, Decimals :: 0..253} | {scientific, Decimals :: 0..249} | compact | short.
傳回一個對應於使用固定小數點格式的 Float
的文字表示形式的字串。
可用的選項
- 如果指定選項
decimals
,則傳回的值最多包含小數點後Decimals
位數的數字。如果數字不符合 256 位元組的內部靜態緩衝區,則該函式會拋出badarg
。 - 如果指定選項
compact
,則會截斷列表末尾的尾隨零。此選項僅在與選項decimals
一起使用時才有意義。 - 如果指定選項
scientific
,則使用科學記號格式化浮點數,並具有Decimals
位數的精度。 - 如果指定選項
short
,則格式化浮點數時會使用最小位數,仍然保證F =:= list_to_float(float_to_list(F, [short]))
。當浮點數在範圍 (-2⁵³, 2⁵³) 內時,會使用產生最小字元數的表示法(科學記號表示法或一般十進制表示法)。範圍 (-2⁵³, 2⁵³) 之外的浮點數始終使用科學記號格式化,以避免在執行算術運算時造成混淆的結果。 - 如果
Options
為[]
,則該函式的行為方式與float_to_list/1
相同。
範例
> float_to_list(7.12, [{decimals, 4}]).
"7.1200"
> float_to_list(7.12, [{decimals, 4}, compact]).
"7.12"
> float_to_list(7.12, [{scientific, 3}]).
"7.120e+00"
> float_to_list(7.12, [short]).
"7.12"
> float_to_list(0.1+0.2, [short]).
"0.30000000000000004"
> float_to_list(0.1+0.2)
"3.00000000000000044409e-01"
在最後一個範例中,float_to_list(0.1+0.2)
的計算結果為 "3.00000000000000044409e-01"
。原因已在浮點數的表示問題中解釋。
傳回不大於 Number
的最大整數。
例如
> floor(-10.5).
-11
-spec fun_info(Fun) -> [{Item, Info}] when Fun :: function(), Item :: arity | env | index | name | module | new_index | new_uniq | pid | type | uniq, Info :: term().
傳回一個包含函式 Fun
資訊的清單。每個清單元素都是一個元組。元組的順序是未定義的,並且在未來版本中可以新增更多元組。
警告
此 BIF 主要用於除錯,但有時在需要驗證(例如 fun 的 arity)的程式庫函式中很有用。
兩種類型的 fun 具有稍微不同的語義
- 由
fun M:F/A
建立的 fun 稱為外部 fun。呼叫它將始終呼叫模組M
最新程式碼中 arity 為A
的函式F
。請注意,當建立 funfun M:F/A
時,甚至不需要載入模組M
。 - 所有其他 fun 都稱為本地 fun。當呼叫本地 fun 時,會呼叫建立 fun 的相同版本的程式碼(即使已載入模組的較新版本)。
對於本地和外部 fun,以下元素始終存在於列表中
{type, Type}
-Type
為local
或external
。{module, Module}
-Module
(一個原子) 是模組名稱。如果
Fun
是本地 fun,則Module
是定義該 fun 的模組。如果
Fun
是外部 fun,則Module
是 fun 指向的模組。{name, Name}
-Name
(一個原子) 是函式名稱。如果
Fun
是本地 fun,則Name
是實作該 fun 的本地函式的名稱。(此名稱由編譯器產生,僅供參考之用。由於它是本地函式,因此無法直接呼叫。)如果目前沒有為 fun 載入任何程式碼,則會傳回[]
而不是原子。如果
Fun
是外部 fun,則Name
是 fun 指向的已匯出函式的名稱。{arity, Arity}
-Arity
是 fun 被呼叫時所使用的參數數量。{env, Env}
-Env
(一個列表) 是 fun 的環境或自由變數。對於外部 fun,傳回的列表始終為空。
只有當 Fun
是本地 fun 時,以下元素才會存在於列表中
{pid, Pid}
-Pid
是本地節點上init
程序的程序識別碼。變更
從 Erlang/OTP 27 開始,無論最初在哪個程序或節點上建立 fun,
Pid
始終指向本地init
程序。請參閱 即將出現的潛在不相容性。
{index, Index}
-Index
(一個整數) 是模組 fun 表格中的索引。{new_index, Index}
-Index
(一個整數) 是模組 fun 表格中的索引。{new_uniq, Uniq}
-Uniq
(一個二進位) 是此 fun 的唯一值。它是從整個模組的已編譯程式碼計算而來的。{uniq, Uniq}
-Uniq
(一個整數) 是此 fun 的唯一值。從 Erlang/OTP R15 起,此整數是從整個模組的已編譯程式碼計算而來的。在 Erlang/OTP R15 之前,此整數僅基於 fun 的主體。
-spec fun_info(Fun, Item) -> {Item, Info} when Fun :: function(), Item :: fun_info_item(), Info :: term().
以 {Item,Info}
形式傳回 Fun
的資訊,如 Item
所指定。
對於任何 fun,Item
可以是原子 module
、name
、arity
、env
或 type
中的任何一個。
對於本地函式(local fun),Item
也可以是原子(atom)index
、new_index
、new_uniq
、uniq
和 pid
。對於外部函式(external fun),這些項目的值永遠是原子 undefined
。
請參閱 erlang:fun_info/1
。
傳回 String
,代表建立 Fun
的程式碼。
如果 Fun
是由 fun 運算式以 fun ModuleName:FuncName/Arity
的形式建立,則 String
具有以下形式:
"fun ModuleName:FuncName/Arity"
當 Fun
是從其他類型的 fun 運算式建立時,String
的形式會有所不同,取決於 fun 運算式是在執行編譯過的程式碼時執行,還是在執行未編譯的程式碼時執行(未編譯的 escript、Erlang shell 和其他由 erl_eval 模組執行的程式碼)。
編譯過的程式碼 -
"#Fun<M.I.U>"
,其中 M、I 和 U 對應於erlang:fun_info(Fun)
結果中名為module
、index
和uniq
的值。未編譯的程式碼 - 所有從未編譯程式碼中的 fun 運算式建立的 fun,若具有相同的 arity,都會被
fun_to_list/1
映射到同一個列表。
注意
一般而言,不能使用
fun_to_list/1
來檢查兩個 fun 是否相等,因為fun_to_list/1
不會將 fun 的環境納入考量。請參閱erlang:fun_info/1
,以了解如何取得 fun 的環境。
變更
fun_to_list/1
的輸出在不同的 Erlang 實作之間可能會有所不同,並且在未來的版本中可能會變更。
範例
-module(test).
-export([add/1, add2/0, fun_tuple/0]).
add(A) -> fun(B) -> A + B end.
add2() -> fun add/1.
fun_tuple() -> {fun() -> 1 end, fun() -> 1 end}.
> {fun test:add/1, test:add2()}.
{fun test:add/1,#Fun<test.1.107738983>}
說明:fun test:add/1
是可升級的,但 test:add2()
不可升級。
> {test:add(1), test:add(42)}.
{#Fun<test.0.107738983>,#Fun<test.0.107738983>}
說明:test:add(1)
和 test:add(42)
具有相同的字串表示形式,因為環境未被納入考量。
>test:fun_tuple().
{#Fun<test.2.107738983>,#Fun<test.3.107738983>}
說明:字串表示形式不同,因為 fun 來自不同的 fun 運算式。
> {fun() -> 1 end, fun() -> 1 end}. >
{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}
說明:所有從未編譯程式碼中,具有相同 arity 的此形式 fun 運算式建立的 fun,都會被 fun_to_list/1
映射到同一個列表。
-spec hd(List) -> Head when List :: nonempty_maybe_improper_list(), Head :: term().
傳回 List
的頭,也就是第一個元素。
它適用於不正確的列表。
範例
> hd([1,2,3,4,5]).
1
> hd([first, second, third, so_on | improper_end]).
first
失敗:如果 List
是空列表 []
,則會產生 badarg
。
-spec insert_element(Index, Tuple1, Term) -> Tuple2 when Index :: pos_integer(), Tuple1 :: tuple(), Tuple2 :: tuple(), Term :: term().
傳回一個新的元組,其中元素 Term
插入到元組 Tuple1
中的位置 Index
。新元組 Tuple2
中從位置 Index
開始的所有元素都向上推高一步。
例如
> erlang:insert_element(2, {one, two, three}, new).
{one,new,two,three}
傳回對應於 Integer
的文字表示形式的二進位。
例如
> integer_to_binary(77).
<<"77">>
傳回對應於以 Base
為底的 Integer
的文字表示形式的二進位。
例如
> integer_to_binary(1023, 16).
<<"3FF">>
傳回一個對應於 Integer
的文字表示形式的字串。
例如
> integer_to_list(77).
"77"
傳回一個對應於以 Base
為底的 Integer
的文字表示形式的字串。
例如
> integer_to_list(1023, 16).
"3FF"
-spec iolist_size(Item) -> non_neg_integer() when Item :: iolist() | binary().
傳回一個整數,該整數是 iolist_to_binary(Item)
的結果的二進位大小(以位元組為單位)。
例如
> iolist_size([1,2|<<3,4>>]).
4
傳回一個由 IoListOrBinary
中的整數和二進位組成的二進位。
例如
> Bin1 = <<1,2,3>>.
<<1,2,3>>
> Bin2 = <<4,5>>.
<<4,5>>
> Bin3 = <<6>>.
<<6>>
> iolist_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).
<<1,2,3,1,2,3,4,5,4,6>>
傳回一個 iovec,該 iovec 是由 IoListOrBinary
中的整數和二進位資料所組成。當您想要將 iolist 平坦化,但又不需要單一二進位資料時,此函數非常有用。這對於將資料傳遞給 NIF 函數 (例如 enif_inspect_iovec
),或進行更有效率的訊息傳遞時很有幫助。使用此函數而不是 iolist_to_binary/1
的優點是,它不需要複製 堆外二進位資料。
例如
> Bin1 = <<1,2,3>>.
<<1,2,3>>
> Bin2 = <<4,5>>.
<<4,5>>
> Bin3 = <<6>>.
<<6>>
%% If you pass small binaries and integers it works as iolist_to_binary
> erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]).
[<<1,2,3,1,2,3,4,5,4,6>>]
%% If you pass larger binaries, they are split and returned in a form
%% optimized for calling the C function writev.
> erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]).
[<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,...>>,
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
...>>,
<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
如果 Term
是原子,則傳回 true
,否則傳回 false
。
如果 Term
是二進位資料,則傳回 true
,否則傳回 false
。
二進位資料永遠包含完整的位元組數。
如果 Term
是位元字串 (包括二進位資料),則傳回 true
,否則傳回 false
。
如果 Term
是原子 true
或原子 false
(即布林值),則傳回 true
。否則傳回 false
。
如果 Term
是浮點數,則傳回 true
,否則傳回 false
。
如果 Term
是 fun,則傳回 true
,否則傳回 false
。
如果 Term
是一個可以與 Arity
個參數一起套用的 fun,則傳回 true
,否則傳回 false
。
如果 Term
是整數,則傳回 true
,否則傳回 false
。
如果 Term
是包含零個或多個元素的列表,則傳回 true
,否則傳回 false
。
如果 Term
是 map,則傳回 true
,否則傳回 false
。
如果 map Map
包含 Key
,則傳回 true
,如果沒有包含 Key
,則傳回 false
。
如果 Map
不是映射(map),則呼叫會失敗並產生 {badmap,Map}
例外。
範例
> Map = #{"42" => value}.
#{"42" => value}
> is_map_key("42",Map).
true
> is_map_key(value,Map).
false
如果 Term
是整數或浮點數,則傳回 true
。否則傳回 false
。
如果 Term
是程序識別碼,則傳回 true
,否則傳回 false
。
如果 Term
是埠識別碼,則傳回 true
,否則傳回 false
。
如果 Term
是元組,且其第一個元素是 RecordTag
,則傳回 true
。否則傳回 false
。
注意
通常,編譯器會特別處理對
is_record/2
的呼叫。它會發出程式碼來驗證Term
是否為元組、其第一個元素是否為RecordTag
,以及大小是否正確。但是,如果RecordTag
不是文字原子,則會改為呼叫 BIFis_record/2
,並且不會驗證元組的大小。
如果 RecordTag
是文字原子,則允許在 guard 測試中使用。
-spec is_record(Term, RecordTag, Size) -> boolean() when Term :: term(), RecordTag :: atom(), Size :: non_neg_integer().
RecordTag
必須是原子。
如果 Term
是元組,其第一個元素是 RecordTag
,且其大小是 Size
,則傳回 true
。否則傳回 false
。
如果 RecordTag
是文字原子,且 Size
是文字整數,則允許在 guard 測試中使用。
注意
為了完整起見,此 BIF 已被記錄下來。通常應該使用
is_record/2
。
如果 Term
是參考,則傳回 true
,否則傳回 false
。
如果 Term
是元組,則傳回 true
,否則傳回 false
。
-spec length(List) -> non_neg_integer() when List :: [term()].
傳回 List
的長度。
例如
> length([1,2,3,4,5,6,7,8,9]).
9
傳回文字表示為 String
的原子。
從 Erlang/OTP 20 開始,String
可以包含任何 Unicode 字元。早期版本只允許使用 ISO-latin-1 字元,因為實作不允許 255 以上的 Unicode 字元。
注意
原子名稱中允許的字元數有限制。預設限制可以在效率指南(系統限制章節)中找到。
注意
對於可以存在的原子數量,有可設定的限制,而且原子不會被垃圾回收。因此,建議考慮
list_to_existing_atom/1
是否比list_to_atom/1
更好的選擇。預設限制可以在效率指南(系統限制章節)中找到。
範例
> list_to_atom("Erlang").
'Erlang'
傳回一個由 IoList
中的整數和二進位資料組成的二進位資料。
例如
> Bin1 = <<1,2,3>>.
<<1,2,3>>
> Bin2 = <<4,5>>.
<<4,5>>
> Bin3 = <<6>>.
<<6>>
> list_to_binary([Bin1,1,[2,3,Bin2],4|Bin3]).
<<1,2,3,1,2,3,4,5,4,6>>
-spec list_to_bitstring(BitstringList) -> bitstring() when BitstringList :: bitstring_list().
傳回一個由 BitstringList
中的整數和位元字串組成的位元字串。(允許 BitstringList
中的最後一個尾部為位元字串。)
例如
> Bin1 = <<1,2,3>>.
<<1,2,3>>
> Bin2 = <<4,5>>.
<<4,5>>
> Bin3 = <<6,7:4>>.
<<6,7:4>>
> list_to_bitstring([Bin1,1,[2,3,Bin2],4|Bin3]).
<<1,2,3,1,2,3,4,5,4,6,7:4>>
傳回文字表示為 String
的原子,但前提是該原子已存在。如果原子已透過載入程式碼或建立原子屬於其中一部分的 term,由執行階段系統建立,則該原子存在。
失敗:如果不存在文字表示形式為 String
的原子,則會產生 badarg
。
注意
請注意,編譯器可能會優化掉原子。例如,編譯器會將
atom_to_list(some_atom)
重寫為"some_atom"
。如果該運算式是包含模組中唯一提到原子some_atom
的地方,則在載入模組時不會建立該原子,且後續對list_to_existing_atom("some_atom")
的呼叫將會失敗。
傳回文字表示為 String
的浮點數。
例如
> list_to_float("2.2017764e+0").
2.2017764
浮點數的字串格式與 Erlang 浮點數文字的格式相同,但底線符號不允許使用。
失敗:如果 String
包含浮點數的錯誤表示,則會返回 badarg
。
傳回文字表示為 String
的整數。
例如
> list_to_integer("123").
123
> list_to_integer("-123").
-123
> list_to_integer("+123234982304982309482093833234234").
123234982304982309482093833234234
String
必須包含至少一個數字字符,並且可以有一個可選的前綴,該前綴由單個 "+
" 或 "-
" 字符組成(也就是說,String
必須匹配正規表示式 "^[+-]?[0-9]+$"
)。
失敗:如果 String
包含整數的錯誤表示,則會返回 badarg
。
傳回以 Base
為基底,文字表示為 String
的整數。
例如
> list_to_integer("3FF", 16).
1023
> list_to_integer("+3FF", 16).
1023
> list_to_integer("3ff", 16).
1023
> list_to_integer("3fF", 16).
1023
> list_to_integer("-3FF", 16).
-1023
例如,當 Base
為 16 時,String
必須匹配正規表示式 "^[+-]?([0-9]|[A-F]|[a-f])+$"
。
失敗:如果 String
包含整數的錯誤表示,則會返回 badarg
。
傳回文字表示為 String
的程序識別碼。
例如
> list_to_pid("<0.4.1>").
<0.4.1>
失敗:如果 String
包含行程識別符的錯誤表示,則會返回 badarg
。
警告
此 BIF 旨在用於除錯,不應在應用程式中使用。
傳回文字表示為 String
的埠識別碼。
例如
> list_to_port("#Port<0.4>").
#Port<0.4>
失敗:如果 String
包含端口識別符的錯誤表示,則會返回 badarg
。
警告
此 BIF 旨在用於除錯,不應在應用程式中使用。
傳回文字表示為 String
的參考。
例如
> list_to_ref("#Ref<0.4192537678.4073193475.71181>").
#Ref<0.4192537678.4073193475.71181>
失敗:如果 String
包含參照的錯誤表示,則會返回 badarg
。
警告
此 BIF 旨在用於除錯,不應在應用程式中使用。
傳回對應於 List
的元組,例如
> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}
List
可以包含任何 Erlang 項。
-spec make_ref() -> reference().
傳回一個 唯一參考。該參考在已連線的節點之間是唯一的。
警告
在 OTP 23 之前,當一個節點使用相同的節點名稱多次重新啟動時,較新節點上建立的參照可能會被誤認為是在具有相同節點名稱的較舊節點上建立的參照。
建立一個具有指定 Arity
的新元組,其中所有元素都是 InitialValue
。
例如
> erlang:make_tuple(4, []).
{[],[],[],[]}
-spec make_tuple(Arity, DefaultValue, InitList) -> tuple() when Arity :: arity(), DefaultValue :: term(), InitList :: [{Position :: pos_integer(), term()}].
建立一個大小為 Arity
的元組,其中每個元素的值都是 DefaultValue
,然後從 InitList
中填入值。
InitList
中的每個列表元素必須是一個雙元素元組,其中第一個元素是新建立的元組中的位置,第二個元素是任何項。如果一個位置在列表中出現多次,則使用最後一次出現的項。
例如
> erlang:make_tuple(5, [], [{2,ignored},{5,zz},{2,aa}]).
{[],aa,[],[],zz}
如果 Map
包含 Key
,則傳回與 Key
關聯的值 Value
。
如果 Map
不是 map,則呼叫會失敗並返回 {badmap,Map}
異常;如果沒有值與 Key
關聯,則會返回 {badkey,Key}
異常。
範例
> Key = 1337,
Map = #{42 => value_two,1337 => "value one","a" => 1},
map_get(Key,Map).
"value one"
-spec map_size(Map) -> non_neg_integer() when Map :: map().
傳回一個整數,即 Map
中鍵值對的數量。
例如
> map_size(#{a=>1, b=>2, c=>3}).
3
-spec match_spec_test(MatchAgainst, MatchSpec, Type) -> TestResult when MatchAgainst :: [term()] | tuple(), MatchSpec :: term(), Type :: table | trace, TestResult :: {ok, term(), [return_trace], [{error | warning, string()}]} | {error, [{error | warning, string()}]}.
測試在呼叫 ets:select/2
和 trace:function/4
時使用的比對規格。
此函數會測試比對規格的「語法」正確性,並針對物件執行比對規格。如果比對規格包含錯誤,則會返回元組 {error, Errors}
,其中 Errors
是自然語言描述,說明比對規格的錯誤之處。
如果 Type
為 table
,則要比對的物件必須是一個元組。然後,此函數會返回 {ok,Result,[],Warnings}
,其中 Result
是在真正的 ets:select/2
呼叫中會產生的結果,如果比對規格與物件元組不符,則會返回 false
。
如果 Type
為 trace
,則要比對的物件必須是一個列表。此函數會返回 {ok, Result, Flags, Warnings}
,其中 Result
是以下其中一項
- 如果需要發出追蹤訊息,則為
true
- 如果不需要發出追蹤訊息,則為
false
- 要附加到追蹤訊息的訊息項
Flags
是一個列表,其中包含要啟用的所有追蹤旗標,目前只有 return_trace
。
這是一個有用的除錯和測試工具,尤其是在撰寫複雜的比對規格時。
另請參閱 ets:test_ms/2
。
傳回 Term1
和 Term2
中較大的值。如果使用 ==
運算子比較時,term 相等,則傳回 Term1
。
運算式章節包含 ==
運算子以及項如何排序的說明。
範例
> max(1, 2).
2
> max(1.0, 1).
1.0
> max(1, 1.0).
1
> max("abc", "b").
"b"
變更
從 Erlang/OTP 26 開始,允許在 guard 測試中使用。
傳回 Term1
和 Term2
中較小的值。如果使用 ==
運算子比較時,term 相等,則傳回 Term1
。
運算式章節包含 ==
運算子以及項如何排序的說明。
範例
> min(1, 2).
1
> min(1.0, 1).
1.0
> min(1, 1.0).
1
> min("abc", "b").
"abc"
變更
從 Erlang/OTP 26 開始,允許在 guard 測試中使用。
傳回 Arg
的來源節點。Arg
可以是程序識別碼、參考或埠。如果 Arg
源自本機節點,且本機節點未處於活動狀態,則傳回 nonode@nohost
。
-spec phash2(Term) -> Hash when Term :: term(), Hash :: non_neg_integer().
與 phash2/2
等效。
-spec phash2(Term, Range) -> Hash when Term :: term(), Range :: pos_integer(), Hash :: non_neg_integer().
可攜式雜湊函數,對於相同的 Erlang term,無論機器架構和 ERTS 版本為何,都會提供相同的雜湊值。
此函數會傳回 Term
在範圍 0..Range-1
內的雜湊值。 Range
的最大值為 2^32。當沒有參數 Range
時,會傳回範圍 0..2^27-1 內的值。
此 BIF 始終用於雜湊項。它比 phash/2
更能分配小整數,並且對於大數和二進位檔來說速度更快。
請注意,範圍 0..Range-1
與 phash/2
的範圍不同,後者的範圍為 1..Range
。
傳回對應於 Pid
文字表示的字串。
例如
> erlang:pid_to_list(self()).
"<0.85.0>"
注意
節點的建立不包含在
Pid
的列表表示中。這表示具有特定名稱的節點在不同的化身中的程序可以獲得相同的列表表示。
傳回對應於埠識別碼 Port
文字表示的字串。
傳回對應於 Ref
文字表示的字串。
警告
此 BIF 旨在用於除錯,不應在應用程式中使用。
透過捨入 Number
,傳回一個整數。
例如
round(42.1).
42
round(5.5).
6
round(-5.5).
-6
round(36028797018963969.0).
36028797018963968
在最後一個範例中,round(36028797018963969.0)
的求值結果為 36028797018963968
。這樣的原因是數字 36028797018963969.0
無法完全表示為浮點數值。相反地,浮點數文字會表示為 36028797018963968.0
,這是最接近的數字,可以完全表示為浮點數值。有關其他資訊,請參閱浮點數的表示。
-spec setelement(Index, Tuple1, Value) -> Tuple2 when Index :: pos_integer(), Tuple1 :: tuple(), Tuple2 :: tuple(), Value :: term().
傳回一個元組,該元組是引數 Tuple1
的副本,其中由整數引數 Index
指定的元素 (第一個元素的索引為 1) 由引數 Value
取代。
例如
> setelement(2, {10, green, bottles}, red).
{10,red,bottles}
-spec size(Item) -> non_neg_integer() when Item :: tuple() | binary().
傳回元組中的元素數量,或二進位資料或位元字串中的位元組數。
例如
> size({morni, mulle, bwange}).
3
> size(<<11, 22, 33>>).
3
對於位元字串,會傳回整數的位元組數。也就是說,如果位元字串中的位元數無法被 8 整除,則產生的位元組數會向下捨入。
另請參閱 tuple_size/1
、byte_size/1
和 bit_size/1
。
-spec split_binary(Bin, Pos) -> {binary(), binary()} when Bin :: binary(), Pos :: non_neg_integer().
傳回一個包含二進位資料的元組,這些二進位資料是將 Bin
在位置 Pos
分割成兩個部分的結果。
這不是破壞性操作。執行操作後,總共有三個二進位檔。
例如
> B = list_to_binary("0123456789").
<<"0123456789">>
> byte_size(B).
10
> {B1, B2} = split_binary(B,3).
{<<"012">>,<<"3456789">>}
> byte_size(B1).
3
> byte_size(B2).
7
-spec term_to_binary(Term) -> ext_binary() when Term :: term().
傳回一個二進位資料物件,該物件是根據 Erlang 外部 term 格式 編碼 Term
的結果。
這可用於各種目的,例如,以有效的方式將項寫入檔案,或將 Erlang 項傳送到分散式 Erlang 不支援的某些類型的通訊通道。
> Bin = term_to_binary(hello).
<<131,100,0,5,104,101,108,108,111>>
> hello = binary_to_term(Bin).
hello
另請參閱 binary_to_term/1
。
注意
無法保證此函數會為相同的項傳回相同的編碼表示。
-spec term_to_binary(Term, Options) -> ext_binary() when Term :: term(), Options :: [compressed | {compressed, Level :: 0..9} | deterministic | {minor_version, Version :: 0..2} | local].
傳回一個二進位資料物件,該物件是根據 Erlang 外部 term 格式 編碼 Term
的結果。
目前支援的選項
compressed
- 壓縮外部項格式。 從 Erlang/OTP R7B 開始,binary_to_term/1
會自動識別壓縮格式。{compressed, Level}
- 將外部項格式壓縮到給定的層級。壓縮層級由Level
指定,Level
是 0..9 範圍內的整數,其中0
- 不執行壓縮(與不提供compressed
選項相同)。1
- 花費的時間最少,但可能無法像較高層級那樣壓縮。6
- 提供compressed
選項時的預設層級。9
- 花費的時間最多,並嘗試產生較小的結果。請注意上一個句子中的「嘗試」;根據輸入項,層級 9 的壓縮產生與層級 1 的壓縮相比,可能會或可能不會產生較小的結果。
{minor_version, Version}
(自 R11B-4 起)
此選項可用於控制一些編碼細節。Version
的有效值為:0
- 浮點數使用文字表示法編碼。可以用 latin1 字串表示的原子會使用 latin1 編碼,而只有無法用 latin1 表示的原子才會使用 utf8 編碼。
1
- 浮點數以更節省空間且更精確的方式編碼(即以 64 位元 IEEE 格式,而不是轉換為文字表示法)。從 Erlang/OTP R11B-4 開始,binary_to_term/1
可以解碼此表示法。可以用 latin1 字串表示的原子會使用 latin1 編碼,而只有無法用 latin1 表示的原子才會使用 utf8 編碼。
2
- 這是 Erlang/OTP 26.0 的預設值。原子會無條件地使用 utf8 編碼。Erlang/OTP 系統從 R16B 開始可以解碼此表示法。
deterministic
(自 OTP 24.1 起)
此選項可用於確保在同一個 Erlang/OTP 主要版本內,相同的詞彙會傳回相同的編碼表示法。但仍無法保證在 Erlang/OTP 的主要版本之間,編碼表示法會保持不變。此選項無法與
local
選項結合使用。local
(自 OTP 26.0 起)
此選項會將Term
編碼為外部詞彙格式的替代本機版本,當由相同的執行階段系統實例解碼時,即使目前的執行階段系統實例的節點名稱和/或建立在編碼和解碼之間發生變化,也會產生與編碼詞彙相同的詞彙。當不使用local
選項進行編碼時,如果目前的執行階段系統實例的節點名稱和/或建立在編碼和解碼之間發生變化,則本機識別碼(例如 pids、ports 和 references)將會不同。這是因為此類識別碼會透過節點名稱和建立來參照特定的節點。當啟動或停止發佈時,執行階段系統實例的節點名稱和建立會發生變化。當使用
-name
或-sname
命令列引數啟動執行階段系統時,就會啟動發佈。請注意,發佈的實際啟動會在啟動階段的其他程式碼開始執行後才會發生。也可以透過呼叫net_kernel:start/2
來啟動發佈,如果未透過命令列啟動,則可以透過呼叫net_kernel:stop/1
來停止發佈。使用
local
選項編碼的詞彙解碼(例如使用binary_to_term()
)會嘗試驗證詞彙是否確實由相同的執行階段系統實例編碼,並且在絕大多數情況下,如果編碼是由另一個執行階段系統實例執行,則會失敗。但是,您不應相信此驗證在所有情況下都有效。您應該確保僅在與編碼詞彙的 Erlang 執行階段系統實例相同的實例上解碼使用local
選項編碼的詞彙。由於只有使用
local
選項編碼詞彙的執行階段系統才能解碼該詞彙,因此本機編碼通常會與其他內容組合在一起,以產生回覆,表示local
編碼的來源。如果使用local
選項編碼的詞彙被剝奪了前導版本號碼,則可以使用外部詞彙格式進行編碼時,將其新增為較大詞彙的一部分(例如作為元組中的元素),例如使用 ei。在ei
的情況下,您可以使用ei_decode_version()
來剝奪其版本號碼,然後將剩餘的本機編碼新增至您使用例如ei_x_append_buf()
進行編碼的內容。當您想要從處理程序向埠 驅動程式發出請求,並在接收回覆時利用選擇性接收最佳化時,就是使用
local
選項的絕佳範例。在此案例中,您想要建立一個參考,使用local
選項在外部詞彙格式上序列化該參考,在請求中將其傳遞至驅動程式,然後在選擇性接收中等待回覆訊息以符合該參考。驅動程式應使用erl_drv_output_term()
或erl_drv_send_term()
,使用在請求中先前收到的外部詞彙格式的參考的詞彙類型ERL_DRV_EXT2TERM
來傳送回覆。請注意,當使用此功能的詞彙類型ERL_DRV_EXT2TERM
時,您不應從本機編碼中剝奪前導版本號碼。如果在此範例中您未使用local
選項編碼參考,並且在請求進行時啟動或停止發佈,則發出請求的處理程序將會無限期地掛起,因為回覆訊息中的參考永遠不會相符。此選項無法與
deterministic
選項結合使用。如需更多資訊,請參閱外部詞彙格式文件中
LOCAL_EXT
標籤。
另請參閱 binary_to_term/1
。
根據 Erlang 外部 term 格式,以 ext_iovec/0
傳回 Term
的編碼。
此函數產生的編碼與 term_to_binary/1
相同,但傳回類型不同。呼叫 iolist_to_binary(term_to_iovec(Term))
將產生與呼叫 term_to_binary(Term)
完全相同的結果。
term_to_iovec()
是 term_to_binary()
所提供功能的純粹最佳化。term_to_iovec()
例如可以直接參照堆積外二進位資料,而不是將二進位資料複製到結果中。
另請參閱 term_to_binary/1
。
-spec term_to_iovec(Term, Options) -> ext_iovec() when Term :: term(), Options :: [compressed | {compressed, Level :: 0..9} | deterministic | {minor_version, Version :: 0..2} | local].
根據 Erlang 外部 term 格式,以 ext_iovec/0
傳回 Term
的編碼。
此函數產生的編碼與 term_to_binary/2
相同,但傳回類型不同。呼叫 iolist_to_binary(term_to_iovec(Term, Opts))
將產生與 term_to_binary(Term, Opts)
完全相同的結果。
目前可辨識的選項是 term_to_binary/2
可辨識的所有選項。
term_to_iovec()
是 term_to_binary()
所提供功能的純粹最佳化。term_to_iovec()
例如可以直接參照堆積外二進位資料,而不是將二進位資料複製到結果中。
另請參閱 term_to_binary/2
。
-spec tl(List) -> Tail when List :: nonempty_maybe_improper_list(), Tail :: term().
傳回 List
的尾部,也就是減去第一個元素的列表。
它適用於不正確的列表。
範例
> tl([geesties, guilies, beasties]).
[guilies, beasties]
> tl([geesties]).
[]
> tl([geesties, guilies, beasties | improper_end]).
[guilies, beasties | improper_end]
> tl([geesties | improper_end]).
improper_end
失敗:如果 List
是空列表 []
,則會產生 badarg
。
截斷 Number
的小數位數。
例如
> trunc(5.7).
5
> trunc(-5.7).
-5
> trunc(5).
5
> trunc(36028797018963969.0).
36028797018963968
在最後一個範例中,trunc(36028797018963969.0)
的評估結果為 36028797018963968
。原因在於數字 36028797018963969.0
無法精確地表示為浮點數值。相反地,浮點字面值表示為 36028797018963968.0
,這是最接近可以精確表示為浮點數值的數字。如需更多資訊,請參閱浮點數的表示法。
-spec tuple_size(Tuple) -> non_neg_integer() when Tuple :: tuple().
傳回一個整數,即 Tuple
中的元素數量。
例如
> tuple_size({morni, mulle, bwange}).
3
傳回對應於 Tuple
的列表。Tuple
可以包含任何 Erlang term。範例
> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]
-spec unique_integer() -> integer().
產生並傳回一個在目前執行階段系統實例上唯一的整數。與呼叫 erlang:unique_integer([])
等效。
-spec unique_integer(ModifierList) -> integer() when ModifierList :: [Modifier], Modifier :: positive | monotonic.
產生並傳回一個在目前執行階段系統實例上唯一的整數。此整數是唯一的,因為此 BIF 使用同一組修飾符,在目前的執行階段系統實例上不會多次傳回相同的整數。每個整數值當然可以透過其他方式建構。
預設情況下,當傳遞 []
作為 ModifierList
時,可以傳回負數和正數整數。這樣做是為了盡可能使用不需要堆積記憶體配置的整數範圍。預設情況下,傳回的整數也僅保證是唯一的,也就是說,任何傳回的整數都可能小於或大於先前傳回的整數。
Modifier
positive - 僅傳回正整數。
請注意,透過傳遞
positive
修飾符,您將更快取得堆積配置的整數(bignums)。monotonic - 傳回對應於建立時間的嚴格單調遞增的整數。也就是說,傳回的整數始終大於目前執行階段系統實例中先前傳回的整數。
這些值可用於判斷執行階段系統實例上事件之間的順序。也就是說,如果
X = erlang:unique_integer([monotonic])
和Y = erlang:unique_integer([monotonic])
都由同一個執行階段系統實例上的不同處理程序(或相同的處理程序)執行,且X < Y
,我們就知道X
是在Y
之前建立的。警告
產生嚴格單調遞增的值在本質上非常昂貴且擴展性不佳。這是因為值需要在 CPU 核心之間同步。也就是說,除非您真的需要嚴格單調遞增的值,否則請勿傳遞
monotonic
修飾符。
可以組合所有有效的 Modifier
。在 ModifierList
中重複(有效)的 Modifier
會被忽略。
注意
透過使用不同的
Modifier
集合,erlang:unique_integer/1
傳回的整數集合將會重疊。例如,透過重複呼叫unique_integer([monotonic])
和unique_integer([positive, monotonic])
,您最終會看到一些同時由兩個呼叫傳回的整數。
失敗
badarg
- 如果ModifierList
不是正確的清單。badarg
- 如果Modifier
不是有效的修飾符。
程序與埠口
-spec alias() -> Alias when Alias :: reference().
與 alias([])
等效。
-spec alias(Opts) -> Alias when Alias :: reference(), Opts :: [explicit_unalias | reply].
建立一個別名,該別名可用於向建立別名的程序傳送訊息。當別名已停用時,使用別名傳送的訊息將會被捨棄。可以使用 unalias/1
來停用別名。
目前可用的 alias/1
選項
explicit_unalias
- 別名只能透過呼叫unalias/1
來停用。如果沒有傳遞任何選項或呼叫alias/0
,這也是預設行為。reply
- 當收到透過別名傳送的回覆訊息時,別名將會自動停用。別名仍然可以透過呼叫unalias/1
來停用。
範例
server() ->
receive
{request, AliasReqId, Request} ->
Result = perform_request(Request),
AliasReqId ! {reply, AliasReqId, Result}
end,
server().
client(ServerPid, Request) ->
AliasReqId = alias([reply]),
ServerPid ! {request, AliasReqId, Request},
%% Alias will be automatically deactivated if we receive a reply
%% since we used the 'reply' option...
receive
{reply, AliasReqId, Result} -> Result
after 5000 ->
unalias(AliasReqId),
%% Flush message queue in case the reply arrived
%% just before the alias was deactivated...
receive {reply, AliasReqId, Result} -> Result
after 0 -> exit(timeout)
end
end.
請注意,這個範例中的伺服器和用戶端都必須在至少 OTP 24 的系統上執行才能正常運作。
有關程序別名的更多資訊,請參閱《Erlang 參考手冊》中 程序別名 章節。
呼叫一個 fun,並將 Args
中的元素當作引數傳遞。
如果參數中的元素數量在編譯時已知,則更好的寫法是 Fun(Arg1, Arg2, ... ArgN)
。
警告
早期,
Fun
也可以指定為{Module, Function}
,等同於apply(Module, Function, Args)
。這種用法已過時,未來版本將停止運作。
-spec apply(Module, Function, Args) -> term() when Module :: module(), Function :: atom(), Args :: [term()].
傳回將 Module
中的 Function
套用至 Args
的結果。所套用的函數必須從 Module
匯出。函數的arity 是 Args
的長度。
例如
> apply(lists, reverse, [[a, b, c]]).
[c,b,a]
> apply(erlang, atom_to_list, ['Erlang']).
"Erlang"
如果參數數量在編譯時已知,則更好的寫法是 Module:Function(Arg1, Arg2, ..., ArgN)
。
失敗:如果呼叫的函式未匯出,則會呼叫 error_handler:undefined_function/3
。錯誤處理程式可以重新定義(請參閱 process_flag/2
)。如果 error_handler
未定義,或者使用者已重新定義預設的 error_handler
,導致替換的模組未定義,則會產生原因為 undef
的錯誤。
-spec bump_reductions(Reductions) -> true when Reductions :: pos_integer().
此實作相依函數會遞增呼叫程序的削減計數器。
在 Beam 模擬器中,每次函式和 BIF 呼叫通常會將減少計數器遞增 1。當計數器達到程序的最大減少次數時(在 Erlang/OTP 19.2 及更高版本中為 4000 次減少),會強制執行上下文切換。
警告
此 BIF 可以在未來版本的 Beam 機器中移除,恕不另行通知。它不太可能在其他 Erlang 實作中實作。
-spec demonitor(MonitorRef) -> true when MonitorRef :: reference().
如果 MonitorRef
是呼叫程序透過呼叫 monitor/2
取得的參考,則會關閉此監視。如果監視已關閉,則不會發生任何事。
一旦 demonitor(MonitorRef)
返回,保證未來不會因為監視器而在呼叫者的訊息佇列中放入 {'DOWN', MonitorRef, _, _, _}
訊息。但是,在呼叫之前,{'DOWN', MonitorRef, _, _, _}
訊息可能已經被放入呼叫者的訊息佇列中。因此,通常建議在停止監視後,從訊息佇列中刪除此類 'DOWN'
訊息。如果需要這種清除操作,可以使用 demonitor(MonitorRef, [flush])
來代替 demonitor(MonitorRef)
。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
變更
在 Erlang/OTP R11B (ERTS 5.5) 之前,
demonitor/1
的行為是完全非同步的,也就是說,監視器會一直處於活動狀態,直到「取消監視訊號」到達被監視的實體。這有一個不良影響。您永遠無法知道何時保證不會因為監視器而收到DOWN
訊息。目前的行為可以視為兩個組合操作:非同步地向被監視的實體傳送「取消監視訊號」,並忽略監視器的任何未來結果。
失敗:如果 MonitorRef
指的是另一個程序啟動的監視,則會發生錯誤。並非所有這類案例的檢查都很便宜。如果檢查很便宜,則呼叫會失敗並顯示 badarg
,例如,如果 MonitorRef
是遠端參考。
-spec demonitor(MonitorRef, OptionList) -> boolean() when MonitorRef :: reference(), OptionList :: [Option], Option :: flush | info.
傳回的值是 true
,除非 info
是 OptionList
的一部分。
demonitor(MonitorRef, [])
等同於 demonitor(MonitorRef)
。
Option
選項
flush
- 停止監視後,如果有的話,從呼叫者的訊息佇列中刪除(一個){_, MonitorRef, _, _, _}
訊息。呼叫
demonitor(MonitorRef, [flush])
等同於以下內容,但更有效率demonitor(MonitorRef), receive {_, MonitorRef, _, _, _} -> true after 0 -> true end
info
- 返回的值是以下之一true
- 已找到並刪除監視器。在這種情況下,尚未傳送且不會傳送與此監視器對應的'DOWN'
訊息。false
- 未找到監視器,無法刪除。這可能是因為有人已將與此監視器對應的'DOWN'
訊息放入呼叫者的訊息佇列中。
如果選項
info
與選項flush
組合使用,如果需要清除,則返回false
,否則返回true
。
變更
未來版本可能會新增更多選項。
失敗
badarg
- 如果OptionList
不是清單。badarg
- 如果Option
是無效選項。badarg
- 與demonitor/1
相同的失敗。
傳回程序字典並將其刪除。
例如
> put(key1, {1, 2, 3}),
put(key2, [a, b, c]),
erase().
[{key1,{1,2,3}},{key2,[a,b,c]}]
傳回與 Key
關聯的值 Val
,並將其從程序字典中刪除。如果沒有值與 Key
關聯,則傳回 undefined
。
此函式目前實作的平均時間複雜度為 O(1
),最差情況下的時間複雜度為 O(N
),其中 N
是程序字典中的項目數量。
例如
> put(key1, {merry, lambs, are, playing}),
X = erase(key1),
{X, erase(key1)}.
{{merry,lambs,are,playing},undefined}
引發類別為 error
,原因為 Reason
的例外狀況。
由於評估此函式會導致拋出例外狀況,因此它沒有返回值。
例外狀況類別 error
的目的是表示發生了意外錯誤(例如,呼叫函式時使用的參數類型不正確)。有關更多資訊,請參閱有關錯誤和錯誤處理的指南。範例
> catch error(foobar).
{'EXIT',{foobar,[{shell,apply_fun,3,
[{file,"shell.erl"},{line,906}]},
{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,677}]},
{erl_eval,expr,5,[{file,"erl_eval.erl"},{line,430}]},
{shell,exprs,7,[{file,"shell.erl"},{line,687}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]}}
使用原因 Reason
引發類別為 error
的例外。 Args
預期是目前函式的參數列表,或是原子 none
。
如果 Args
是清單,則用於為堆疊回溯中的目前函式提供參數。如果它是 none
,則在堆疊追蹤中使用呼叫函式的參數數量。由於評估此函式會導致引發例外狀況,因此它沒有返回值。
例外狀況類別 error
的目的是表示發生了意外錯誤(例如,呼叫函式時使用的參數類型不正確)。有關更多資訊,請參閱有關錯誤和錯誤處理的指南。範例
test.erl
:
-module(test).
-export([example_fun/2]).
example_fun(A1, A2) ->
erlang:error(my_error, [A1, A2]).
Erlang shell
6> c(test).
{ok,test}
7> test:example_fun(arg1,"this is the second argument").
** exception error: my_error
in function test:example_fun/2
called as test:example_fun(arg1,"this is the second argument")
-spec error(Reason, Args, Options) -> no_return() when Reason :: term(), Args :: [term()] | none, Options :: [Option], Option :: {error_info, ErrorInfoMap}, ErrorInfoMap :: #{cause => term(), module => module(), function => atom()}.
使用原因 Reason
引發類別為 error
的例外。 Args
預期是目前函式的參數列表,或是原子 none
。
如果 Args
是清單,則用於為堆疊回溯中的目前函式提供參數。如果它是 none
,則在堆疊追蹤中使用呼叫函式的參數數量。由於評估此函式會導致引發例外狀況,因此它沒有返回值。
如果提供 error_info
選項,則 ErrorInfoMap
將會插入到堆疊追蹤中。ErrorInfoMap
中給定的資訊將由錯誤格式化程式(例如 erl_error
)使用,以提供更多有關錯誤的上下文。
ErrorInfoMap
的預設 module
是呼叫 error/3
的模組。預設的 function
是 format_error
。有關如何使用此 Module:Function/2 的更多詳細資訊,請參閱 format_error/2
。
例外狀況類別 error
的目的是表示發生了意外錯誤(例如,呼叫函式時使用的參數類型不正確)。有關更多資訊,請參閱有關錯誤和錯誤處理的指南。
使用退出原因 Reason
引發類別為 exit
的例外。
由於評估此函式會導致引發例外狀況,因此它沒有返回值。
例外狀況類別 exit
的目的是應該停止目前的程序(例如,收到告知程序停止的訊息時)。
此函式與 error/1,2,3
的不同之處在於,它會導致不同類別的例外狀況,並且其原因不包括來自呼叫堆疊的函式清單。
有關更多資訊,請參閱有關錯誤和錯誤處理的指南。
範例
> exit(foobar).
** exception exit: foobar
> catch exit(foobar).
{'EXIT',foobar}
注意
如果一個程序呼叫
exit(kill)
且未捕獲例外,它將以結束原因kill
終止,並且也會向所有連結的程序發出結束訊號,結束原因為kill
(而非killed
)。 具有結束原因kill
的此類結束訊號可以被連結的程序捕獲。 請注意,這表示具有結束原因kill
的訊號,其行為會因發送方式而異,因為如果程序使用erlang:exit/2
向另一個程序發送此類訊號,則該訊號將無法被捕獲。
向 Pid
所識別的程序或埠傳送帶有退出原因 Reason
的退出信號。
如果 Reason
是除了 normal
或 kill
之外的任何詞,且 P
是由 Pid
識別的程序或埠,則適用以下行為:
- 如果
P
沒有捕捉結束訊號,則P
將以結束原因Reason
結束。 - 如果
P
有捕捉結束訊號,則結束訊號會轉換為訊息{'EXIT', From, Reason}
,其中From
是發送結束訊號的程序的程序識別符,並傳送到P
的訊息佇列。
如果 Reason
是詞 normal
,且 Pid
是程序 P
的識別符,而該程序與調用 erlang:exit(Pid, normal)
的程序不同(關於程序向自身發送 normal
原因訊號的行為,請參閱警告),則適用以下行為:
- 如果
P
有捕捉結束訊號,則結束訊號會轉換為訊息{'EXIT', From, normal}
,其中From
是發送結束訊號的程序的程序識別符,並傳送到P
的訊息佇列。 - 如果
P
沒有捕捉結束訊號,則該訊號無效。
如果 Reason
是原子 kill
,也就是說,如果呼叫 exit(Pid, kill)
,則會向由 Pid
識別的程序發送一個不可捕獲的結束訊號,該程序會無條件地以結束原因 killed
結束。結束原因從 kill
變更為 killed
,以提示連結的程序,被終止的程序是透過呼叫 exit(Pid, kill)
而被終止的。
注意
函數
erlang:exit/1
和erlang:exit/2
名稱相似,但提供非常不同的功能。erlang:exit/1
函數應該在目的是停止目前程序時使用,而erlang:exit/2
應該在目的是向另一個程序發送結束訊號時使用。另請注意,erlang:exit/1
會引發可捕獲的例外,而erlang:exit/2
不會引發任何例外。
警告
上述描述未涵蓋的唯一情境是,當程序
P
向自身發送原因為normal
的結束訊號時,即erlang:exit(self(), normal)
。 在此情境中的行為如下:
- 如果
P
有捕捉結束訊號,則結束訊號會轉換為訊息{'EXIT', From, normal}
,其中From
是P
的程序識別符,並傳送到P
的訊息佇列。- 如果
P
沒有捕捉結束訊號,則P
將以原因normal
結束。請注意,上述行為與程序向另一個程序發送原因為
normal
的結束訊號時不同。 這種行為可以說是奇怪的,但為了向後相容性而保留了這種行為。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
-spec garbage_collect() -> true.
強制立即對正在執行的程序進行垃圾回收。
除非已注意到(或有充分理由懷疑)自發垃圾收集將太晚發生或根本不會發生,否則不應使用此函數。
警告
不當使用會嚴重降低系統效能。
-spec garbage_collect(Pid, OptionList) -> GCResult | async when Pid :: pid(), RequestId :: term(), Option :: {async, RequestId} | {type, major | minor}, OptionList :: [Option], GCResult :: boolean().
對 Pid
所識別的本機節點程序進行垃圾回收。
選項
:
{async, RequestId}
- 函數garbage_collect/2
在傳送請求後立即傳回值async
。 處理完請求後,呼叫此函數的程序會收到形式為{garbage_collect, RequestId, GCResult}
的訊息。{type, 'major' | 'minor'}
- 觸發所請求類型的垃圾收集。預設值為'major'
,這會觸發完整掃描 GC。選項'minor'
被視為提示,可能會導致次要或主要 GC 執行。
如果 Pid
等於 self/0
,且未傳遞任何 async
選項,則會立即執行垃圾收集,也就是說,與呼叫 garbage_collect/0
相同。 否則,會向由 Pid
識別的程序傳送垃圾收集請求,並在適當的時候處理。如果未傳遞任何 async
選項,則呼叫者會封鎖,直到 GCResult
可用並可以傳回。
GCResult
會告知垃圾收集請求的結果,如下所示:
true
- 已對由Pid
識別的程序進行垃圾收集。false
- 未執行垃圾收集,因為由Pid
識別的程序在請求獲得滿足之前已終止。
請注意,與 garbage_collect/0
相同的警告也適用。
失敗
badarg
- 如果Pid
不是節點本機程序識別符。badarg
- 如果OptionList
是一個無效的選項列表。
將程序字典以 {Key, Val}
元組的列表形式回傳。回傳列表中的項目順序不拘。
例如
> put(key1, merry),
put(key2, lambs),
put(key3, {are, playing}),
get().
[{key1,merry},{key2,lambs},{key3,{are,playing}}]
回傳程序字典中與 Key
相關聯的值 Val
,如果 Key
不存在則回傳 undefined
。
目前此函數實作的預期時間複雜度為 O(1
),最壞情況下的時間複雜度為 O(N
),其中 N
是程序字典中的項目數。
例如
> put(key1, merry),
put(key2, lambs),
put({any, [valid, term]}, {are, playing}),
get({any, [valid, term]}).
{are,playing}
-spec get_keys() -> [Key] when Key :: term().
回傳程序字典中所有鍵的列表。回傳列表中的項目順序不拘。
例如
> put(dog, {animal,1}),
put(cow, {animal,2}),
put(lamb, {animal,3}),
get_keys().
[dog,cow,lamb]
回傳在程序字典中與值 Val
相關聯的鍵的列表。回傳列表中的項目順序不拘。
例如
> put(mary, {1, 2}),
put(had, {1, 2}),
put(a, {1, 2}),
put(little, {1, 2}),
put(dog, {1, 3}),
put(lamb, {1, 2}),
get_keys({1, 2}).
[mary,had,a,little,lamb]
-spec group_leader() -> pid().
回傳評估此函式的程序的群組領導者的程序識別符。
每個程序都是某個程序群組的成員,而所有群組都有一個群組領導者。 來自群組的所有 I/O 都會傳送到群組領導者。 當產生新的程序時,它會取得與產生程序相同的群組領導者。
最初,在系統啟動時,init
既是其自己的群組領導者,也是所有程序的群組領導者。 在系統啟動期間,程序的群組領導者將根據系統的需求而變更。 完成此操作的一些範例包括:
- 當啟動應用程式時,該應用程式的頂層監管者會將其群組領導者設定為應用程式主控。 如需更多詳細資訊,請參閱
application:start/2
。 - 當執行測試時,
common_test
和eunit
都會設定群組領導者,以便擷取來自測試案例的任何 I/O。 - 互動式 shell 會設定群組領導者以攔截 I/O。
將 Pid
的群組領導者設定為 GroupLeader
。通常,當從某個 shell 啟動的程序要擁有與 init
不同的群組領導者時會使用此設定。
具有監管樹的應用程式很少應該變更群組領導者,因為 OTP 假設其程序的群組領導者是其應用程式主控。
設定群組領導者遵循Erlang 參考手冊中 程序章節中所述的訊號排序保證。
另請參閱與啟動和停止應用程式相關的 group_leader/0
和 OTP 設計原則。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
-spec hibernate(Module, Function, Args) -> no_return() when Module :: module(), Function :: atom(), Args :: [term()].
使呼叫程序進入等待狀態,其中記憶體分配已盡可能減少。如果該程序預計不會很快收到任何訊息,則這非常有用。
當向程序傳送訊息時,程序會被喚醒,並且控制會在 Module:Function
中恢復,其中包含 Args
指定的引數,並且呼叫堆疊清空,這表示當該函數傳回時,程序會終止。 因此,erlang:hibernate/3
永遠不會傳回其呼叫者。 恢復函數 Module:Function/Arity
必須匯出 (Arity
=:= length(Args)
)。
如果程序在其訊息佇列中有任何訊息,則程序會立即以先前描述的相同方式被喚醒。
更技術地說,erlang:hibernate/3
會捨棄程序的呼叫堆疊,然後對程序進行垃圾收集。 在此之後,所有存活資料都在一個連續的堆積中。 然後,堆積會縮小到與它保存的存活資料完全相同的大小(即使該大小小於程序的最小堆積大小)。
如果程序中存活資料的大小小於最小堆積大小,則在程序喚醒後發生的第一個垃圾收集會確保堆積大小變更為不小於最小堆積大小的大小。
請注意,清空呼叫堆疊表示會移除任何周圍的 catch
,且必須在休眠後重新插入。 這種做法的其中一個影響是,使用 proc_lib
啟動的程序(也間接地,例如 gen_server
程序)應該改用 proc_lib:hibernate/3
,以確保在程序喚醒時例外處理常式繼續運作。
Pid
必須參照本機節點上的程序。
如果程序存在且處於活動狀態,也就是說,沒有退出且尚未退出,則傳回 true
。 否則傳回 false
。
如果程序 P1
呼叫 is_process_alive(P2Pid)
,保證在呼叫之前,從 P1
送往 P2
(P2
是識別碼為 P2Pid
的程序)的所有訊號,會在檢查 P2
的存活狀態前送達 P2
。這項保證表示可以使用 is_process_alive/1
,讓程序 P1
等待直到程序 P2
被終止,而 P2
是從 P1 收到帶有 kill
原因的結束訊號。
例如
exit(P2Pid, kill),
% P2 might not be killed
is_process_alive(P2Pid),
% P2 is not alive (the call above always return false)
請參閱關於 訊號 和 erlang:exit/2 的文件,以取得更多關於訊號和結束訊號的資訊。
在呼叫程序與由 PidOrPort
所識別的另一個程序或埠之間建立並啟用連結。
從這裡開始,我們將把被識別的程序或埠稱為連結對象(linkee)。如果連結對象是一個埠,它必須與呼叫者位於同一個節點上。
如果連結的其中一方終止,它將會傳送一個結束訊號給另一方。結束訊號會包含已終止方的結束原因。因連結而觸發結束訊號的其他情況包括:連結對象不存在(noproc
結束原因)以及在不同節點上的連結程序之間的連線遺失或無法建立(noconnection
結束原因)。
可以透過呼叫 unlink/1
來移除現有的連結。有關連結和由於連結產生的結束訊號的更多資訊,請參閱Erlang 參考手冊中的程序章節。
由於歷史原因,當檢查連結對象是否存在不耗費太多資源,且呼叫者沒有截取結束時,link/1
有一個奇怪的半同步行為。如果上述情況為真,且連結對象不存在,link/1
將會引發一個 noproc
錯誤例外。預期的行為應該是 link/1
回傳 true
,而呼叫者稍後會收到一個帶有 noproc
結束原因的結束訊號,但遺憾的是,事實並非如此。noproc
例外 不應與帶有 noproc
結束原因的 結束訊號 混淆。目前,當連結對象預期與呼叫程序位於同一個節點時,檢查它是否存在並不耗費太多資源。
連結的設定和啟動是以非同步方式執行。如果連結已存在,或者呼叫者嘗試建立與自身的連結,則不會執行任何操作。有關連結協定的詳細描述,請參閱 ERTS 使用者指南中的分佈協定章節。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
失敗
- 如果
PidOrPort
沒有識別出程序或節點本機埠,則會返回badarg
。 - 如果連結對象不存在,並且如上所述,檢查它是否存在不耗費太多資源,則會返回
noproc
。
-spec monitor(process, monitor_process_identifier()) -> MonitorRef when MonitorRef :: reference(); (port, monitor_port_identifier()) -> MonitorRef when MonitorRef :: reference(); (time_offset, clock_service) -> MonitorRef when MonitorRef :: reference().
向 Item
所識別的實體傳送類型為 Type
的監控請求。
如果被監控的實體不存在或其監控狀態發生變化,monitor/2
的呼叫者會收到以下格式的訊息通知
{Tag, MonitorRef, Type, Object, Info}
注意
監控請求是一個非同步訊號。也就是說,訊號需要一段時間才能到達目的地。
Type
可以是以下原子之一:process
、port
或 time_offset
。
process
或 port
監控只會觸發一次,之後便會從監控程序和被監控的實體中移除。當被監控的程序或埠終止、在建立時不存在,或者與它的連線遺失時,監控會被觸發。如果與它的連線遺失,我們不知道它是否仍然存在。當呼叫 demonitor/1
時,監控也會被關閉。
按名稱進行的 process
或 port
監控,只會在監控實例化時將 RegisteredName
解析為 pid/0
或 port/0
,之後對名稱註冊的變更不會影響現有的監控。
當 process
或 port
監控被觸發時,會傳送一個 'DOWN'
訊息,其模式如下
{'DOWN', MonitorRef, Type, Object, Info}
在監控訊息中,MonitorRef
和 Type
與先前描述的相同,並且
Object
- 觸發事件的被監控實體。當監控程序或本機埠時,Object
將等於被監控的pid/0
或port/0
。當按名稱監控程序或埠時,Object
的格式將為{RegisteredName, Node}
,其中RegisteredName
是在呼叫monitor/2
時使用的名稱,而Node
是本機或遠端節點名稱(對於按名稱監控的埠,Node
始終是本機節點名稱)。Info
- 程序的結束原因、noproc
(程序或埠在建立監控時不存在),或noconnection
(與被監控程序所在的節點沒有連線)。監控
程序
- 在當前程序和另一個由Item
識別的程序之間建立監控,該Item
可以是pid/0
(本機或遠端)、原子RegisteredName
或位於其他位置的已註冊程序的 tuple{RegisteredName, Node}
。變更
在 ERTS 10.0(OTP 21.0)之前,如果被監控的程序位於原始節點(例如 erl_interface 或 jinterface)上,而該節點未實作遠端程序監控,則監控程序可能會失敗,並出現
badarg
錯誤。現在,此類對
monitor
的呼叫將改為成功,並且會建立監控。但是,該監控只會監督連線。也就是說,可能接收到的唯一訊息是{'DOWN', _, process, _, noconnection}
,因為原始節點沒有辦法報告被監控程序的狀態。監控
埠
- 在當前程序和由Item
識別的埠之間建立監控,該Item
可以是port/0
(僅限本機)、原子RegisteredName
或位於此節點上的已註冊埠的 tuple{RegisteredName, Node}
。請注意,嘗試監控遠端埠將導致badarg
。自 OTP 19.0 起可用。
監控
time_offset
- 監控time_offset/0
在 Erlang 單調時間和 Erlang 系統時間之間的變化。與time_offset Type
結合使用時,只有一個有效的Item
,即原子clock_service
。請注意,原子clock_service
不是 程序的註冊名稱。在這種情況下,它作為目前執行階段系統實例的執行階段系統內部時鐘服務的識別碼。當時間偏移量發生變化時,會觸發監控。這發生在時間偏移值變更時,或者在使用 單時間跳躍模式時,在 時間偏移量最終確定期間從初步變為最終時。當從初步時間偏移量變更為最終時間偏移量時,無論時間偏移值是否變更,監控都會觸發一次。
如果執行階段系統處於 多時間跳躍模式,則當執行階段系統偵測到 作業系統系統時間已變更時,時間偏移量會變更。然而,執行階段系統不會在發生時立即偵測到這一點。一個檢查時間偏移量的任務將排程至少每分鐘執行一次,因此在正常操作下,這將在一分鐘內被偵測到,但在高負載期間可能需要更長的時間。
監控在觸發後不會自動移除。也就是說,時間偏移量的重複變更會重複觸發監控。
當監控被觸發時,會向監控程序傳送一個
'CHANGE'
訊息。'CHANGE'
訊息的模式如下{'CHANGE', MonitorRef, Type, Item, NewTimeOffset}
其中
MonitorRef
、Type
和Item
與上述描述相同,而NewTimeOffset
是新的時間偏移量。當收到
'CHANGE'
訊息時,您保證在呼叫erlang:time_offset/0
時不會擷取到舊的時間偏移量。請注意,您可以在收到'CHANGE'
訊息之前,在呼叫erlang:time_offset/0
時觀察到時間偏移量的變更。自 OTP 18.0 起可用。
對相同的 Item
和/或 Type
多次呼叫 monitor/2
並不是錯誤;它會產生多個獨立的監控實例。
監控功能預期會擴展。也就是說,預期未來版本將支援其他 Type
和 Item
。
注意
如果或當
monitor/2
被擴展時,將會引入監控訊息中Tag
、Object
和Info
的其他可能值。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
-spec monitor(process, monitor_process_identifier(), [monitor_option()]) -> MonitorRef when MonitorRef :: reference(); (port, monitor_port_identifier(), [monitor_option()]) -> MonitorRef when MonitorRef :: reference(); (time_offset, clock_service, [monitor_option()]) -> MonitorRef when MonitorRef :: reference().
提供選項列表以修改 monitor/2
提供的監控功能。Type
和 Item
參數的含義與傳遞給 monitor/2
時相同。
目前可用的選項
{alias, UnaliasOpt}
- 返回的監控參考也會成為呼叫程序的別名。也就是說,返回的參考可以用於向呼叫程序傳送訊息。另請參閱alias/0
。UnaliasOpt
決定應如何停用別名。explicit_unalias
- 只有明確呼叫unalias/1
才會停用別名。demonitor
- 當監視器被移除時,別名會自動停用。這可以透過明確呼叫demonitor/1
,或者當由於監視器而傳遞'DOWN'
訊息時,同時自動移除。別名也可以透過呼叫unalias/1
來停用。reply_demonitor
- 當監視器被移除時(請參閱上面的demonitor
選項),或者透過別名傳送的回覆訊息被接收時,別名會自動停用。當透過別名收到回覆訊息時,監視器也會自動移除。這在客戶端/伺服器情境中很有用,當客戶端監視伺服器時,將透過別名取得回覆。一旦收到回覆,無論回覆是回覆訊息還是'DOWN'
訊息,別名和監視器都會自動移除。別名也可以透過呼叫unalias/1
來停用。請注意,如果使用unalias/1
BIF 移除別名,監視器仍將保持啟用狀態。
範例
server() -> receive {request, AliasReqId, Request} -> Result = perform_request(Request), AliasReqId ! {reply, AliasReqId, Result} end, server(). client(ServerPid, Request) -> AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]), ServerPid ! {request, AliasMonReqId, Request}, %% Alias as well as monitor will be automatically deactivated if we %% receive a reply or a 'DOWN' message since we used 'reply_demonitor' %% as unalias option... receive {reply, AliasMonReqId, Result} -> Result; {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} -> error(ExitReason) end.
請注意,這個範例中的伺服器和用戶端都必須在至少 OTP 24 的系統上執行才能正常運作。
有關程序別名的更多資訊,請參閱《Erlang 參考手冊》中 程序別名 章節。
{tag, UserDefinedTag}
- 在觸發監視器時傳遞的監視訊息中,將預設的Tag
替換為UserDefinedTag
。例如,當監視程序時,下行訊息中的'DOWN'
標籤將被UserDefinedTag
取代。以下是如何使用
{tag, UserDefinedTag}
選項來啟用 OTP 24 中引入的新的選擇性接收優化,當向不同的伺服器發出多個請求時。server() -> receive {request, From, ReqId, Request} -> Result = perform_request(Request), From ! {reply, self(), ReqId, Result} end, server(). client(ServerPids, Request) when is_list(ServerPids) -> ReqId = make_ref(), lists:foreach(fun (ServerPid) -> _ = monitor(process, ServerPid, [{tag, {'DOWN', ReqId}}]), ServerPid ! {request, self(), ReqId, Request} end, ServerPids), receive_replies(ReqId, length(ServerPids), []). receive_replies(_ReqId, 0, Acc) -> Acc; receive_replies(ReqId, N, Acc) -> %% The compiler will detect that we match on the 'ReqId' %% reference in all clauses, and will enable the selective %% receive optimization which makes the receive able to %% skip past all messages present in the message queue at %% the time when the 'ReqId' reference was created... Res = receive {reply, ServerPid, ReqId, Result} -> %% Here we typically would have deactivated the %% monitor by a call to demonitor(Mon, [flush]) but %% we ignore this in this example for simplicity... {ok, ServerPid, Result}; {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} -> {error, ServerPid, ExitReason} end, receive_replies(ReqId, N-1, [Res | Acc]).
為了使這個範例按預期工作,客戶端必須至少在 OTP 24 系統上執行,但伺服器可以在較舊的系統上執行。
運作方式與 error/1
完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。
運作方式與 error/2
完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。
-spec open_port(PortName, PortSettings) -> port() when PortName :: {spawn, Command :: string() | binary()} | {spawn_driver, Command :: string() | binary()} | {spawn_executable, FileName :: file:name_all()} | {fd, In :: non_neg_integer(), Out :: non_neg_integer()}, PortSettings :: [Opt], Opt :: {packet, N :: 1 | 2 | 4} | stream | {line, L :: non_neg_integer()} | {cd, Dir :: string() | binary()} | {env, Env :: [{Name :: os:env_var_name(), Val :: os:env_var_value() | [] | false}]} | {args, [string() | binary()]} | {arg0, string() | binary()} | exit_status | use_stdio | nouse_stdio | stderr_to_stdout | in | out | binary | eof | {parallelism, Boolean :: boolean()} | hide | {busy_limits_port, {non_neg_integer(), non_neg_integer()} | disabled} | {busy_limits_msgq, {non_neg_integer(), non_neg_integer()} | disabled}.
回傳開啟新的 Erlang 埠的結果作為埠識別符。埠可以被視為外部 Erlang 程序。
如果在 Unicode 檔案名稱模式下執行系統,則在 cd
、env
、args
和 arg0
中指定的執行檔名稱以及參數會受到 Unicode 檔案名稱轉換的影響。為了避免轉換或強制執行,例如 UTF-8,請以正確的編碼將執行檔和/或參數以二進制形式提供。有關詳細資訊,請參閱模組 file
、Kernel 中的函數 file:native_name_encoding/0
和Erlang 中使用 Unicode
使用者指南。
注意
如果 Erlang 虛擬機在 Unicode 檔案名稱轉換模式下啟動,則名稱中的字元(如果指定為列表)只能 > 255。否則,執行檔的名稱將限制為 ISO Latin-1 字元集。
PortName
{spawn, Command}
- 啟動外部程式。Command
是要執行的外部程式的名稱。除非找到名稱為Command
的 Erlang 驅動程式,否則Command
會在 Erlang 工作空間之外執行。如果找到,則會啟動該驅動程式。驅動程式會在 Erlang 工作空間中執行,這表示它與 Erlang 運行時系統連結。對於外部程式,會搜尋
PATH
(或使用等效方法來查找程式,取決於作業系統)。這是透過在某些平台上調用 Shell 來完成的。命令的第一個以空格分隔的 Token 會被視為執行檔(或驅動程式)的名稱。這(以及其他因素)使得此選項不適合執行檔案名稱或目錄名稱中包含空格的程式。如果希望執行檔名稱中包含空格,請改用{spawn_executable, Command}
。警告
在 Unix 系統上,參數會作為字串陣列傳遞到新的作業系統程序,但在 Windows 上,則由子程序解析它們,並且某些 Windows 程式可能會應用自己的規則,這些規則與標準 C 運行時
argv
解析不一致。當調用
.bat
、.cmd
或.com
檔案時,尤其會造成問題,因為這些檔案會透過cmd.exe
隱式執行,而其參數解析容易受到惡意輸入的攻擊,並可用於執行任意 Shell 命令。因此,如果您在 Windows 上執行並且執行批次檔案或
.com
應用程式,則不得將不受信任的輸入作為參數傳遞給程式。這會影響spawn
和spawn_executable
。{spawn_executable, FileName}
- 與{spawn, FileName}
的工作方式類似,但僅執行外部執行檔。整個FileName
都會用作執行檔的名稱,包括任何空格。如果要傳遞參數,可以使用PortSettings
args
和arg0
。通常不會調用 Shell 來啟動程式,而是直接執行。不會搜尋
PATH
(或等效項)。若要在PATH
中尋找要執行的程式,請使用os:find_executable/1
。只有在執行 Shell 腳本或
.bat
檔案時,才會隱式調用適當的命令直譯器,但仍然沒有命令參數展開或隱式PATH
搜尋。如果無法執行
FileName
,則會引發錯誤例外,並以 POSIX 錯誤代碼作為原因。錯誤原因可能因作業系統而異。通常,當嘗試執行找不到的程式時,會引發enoent
錯誤,而當指定的檔案不可執行時,會引發eacces
錯誤。{spawn_driver, Command}
- 與{spawn, Command}
的工作方式類似,但要求命令的第一個(以空格分隔)Token 是已載入的驅動程式名稱。如果沒有載入具有該名稱的驅動程式,則會引發badarg
錯誤。{fd, In, Out}
- 允許 Erlang 程序存取 Erlang 使用的任何目前開啟的檔案描述符。檔案描述符In
可以用於標準輸入,而檔案描述符Out
可以用於標準輸出。它僅用於 Erlang OS 中的各種伺服器(shell
和user
)。因此,其使用受到限制。
PortSettings
是埠的設定列表。有效的設定如下:
{packet, N}
- 訊息前面會加上它們的長度,以N
個位元組傳送,最高有效位元組優先。N
的有效值為 1、2 和 4。stream
- 輸出訊息在沒有封包長度的情況下傳送。Erlang 程序和外部物件之間必須使用使用者定義的通訊協定。{line, L}
- 訊息會按行傳遞。每一行(以作業系統相關的換行符號序列分隔)都會在單一訊息中傳遞。訊息資料格式為{Flag, Line}
,其中Flag
為eol
或noeol
,而Line
是傳遞的資料(不包含換行符號序列)。L
指定最大行長度,以位元組為單位。長度超過此值的行會以多個訊息傳遞,除了最後一則訊息外,所有訊息的Flag
都設定為noeol
。如果在換行符號序列之後立即遇到檔案結尾之外的其他位置,則最後一行也會以Flag
設定為noeol
的形式傳遞。否則,行會以Flag
設定為eol
的形式傳遞。{packet, N}
和{line, L}
設定是互斥的。{cd, Dir}
- 僅適用於{spawn, Command}
和{spawn_executable, FileName}
。外部程式會使用Dir
作為其工作目錄開始執行。Dir
必須是字串。{env, Env}
- 僅適用於{spawn, Command}
和{spawn_executable, FileName}
。啟動程序的環境會使用Env
中的環境規範進行擴充。Env
必須是元組{Name, Val}
的列表,其中Name
是代表環境變數名稱的os:env_var_name/0
,而Val
是代表它要在產生的埠程序中具有的值的os:env_var_name/0
。Name
和Val
都必須是字串。如果
Val
設定為原子false
或空字串(即""
或[]
),則 open_port 將會認為這些變數未設定,如同已呼叫os:unsetenv/1
一樣。有關編碼要求的資訊,請參閱
Name
和Val
類型的文件。{args, [ string() | binary() ]}
- 僅適用於{spawn_executable, FileName}
,並指定可執行檔的引數。每個引數都指定為一個獨立的字串,並且(在 Unix 上)最終會成為引數向量中的一個元素。在其他平台上,會模擬類似的行為。這些引數在提供給可執行檔之前不會被 Shell 展開。最值得注意的是,這表示不會發生檔案萬用字元展開。要展開引數的萬用字元,請使用
filelib:wildcard/1
。請注意,即使程式是 Unix Shell 指令碼,意味著最終會調用 Shell,也不會發生萬用字元展開,並且指令碼會收到未經修改的引數。在 Windows 上,萬用字元展開始終由程式本身決定,因此這不是問題。可執行檔名稱(也稱為
argv[0]
)不應在此清單中指定。適用的情況下,會自動使用正確的可執行檔名稱作為argv[0]
。如果您明確想要在引數向量中設定程式名稱,可以使用選項
arg0
。{arg0, string() | binary()}
- 僅適用於{spawn_executable, FileName}
,並在執行可執行檔時明確指定程式名稱引數。在某些情況下,在某些作業系統上,這可能是必要的。程式如何回應這點高度取決於系統,並且不保證任何特定的效果。exit_status
- 僅適用於{spawn, Command}
(其中Command
指的是外部程式),以及{spawn_executable, FileName}
。當連線到 Port 的外部程序結束時,會傳送格式為
{Port,{exit_status,Status}}
的訊息到連線的程序,其中Status
是外部程序的結束狀態。如果程式在 Unix 上中止,則會使用與 Shell 相同的慣例(即 128+訊號)。如果同時指定選項
eof
,則訊息eof
和exit_status
會以未指定的順序出現。use_stdio
- 僅適用於{spawn, Command}
和{spawn_executable, FileName}
。它允許產生的(Unix)程序的標準輸入和輸出(檔案描述符 0 和 1)與 Erlang 進行通訊。nouse_stdio
- 與use_stdio
相反。它使用檔案描述符 3 和 4 與 Erlang 進行通訊。stderr_to_stdout
- 影響外部程式的 Port。已執行的程式會將其標準錯誤檔案重新導向到其標準輸出檔案。stderr_to_stdout
和nouse_stdio
是互斥的。overlapped_io
- 僅影響 Windows 上外部程式的 Port。如果提供此選項,Port 程式的標準輸入和標準輸出控制代碼將會以標誌FILE_FLAG_OVERLAPPED
開啟,以便 Port 程式可以在其標準控制代碼上執行重疊的 I/O。對於簡單的 Port 程式,通常情況並非如此,但對於經驗豐富的 Windows 程式設計師來說,這是一個有價值的選項。在所有其他平台上,此選項會被靜默丟棄。in
- Port 僅可供輸入使用。out
- Port 僅可供輸出使用。binary
- Port 的所有 I/O 都是二進位資料物件,而不是位元組列表。eof
- Port 不會在檔案結尾時關閉,並且不會產生結束訊號。相反,它會保持開啟,並且會向持有 Port 的程序傳送{Port, eof}
訊息。hide
- 在 Windows 上執行時,會抑制產生 Port 程式時建立新的主控台視窗。(此選項在其他平台上無效。){parallelism, Boolean}
- 設定 Port 並行性的排程器提示。如果設定為true
,則虛擬機器會排程 Port 任務;這樣做時,它會提高系統中的並行性。如果設定為false
,則虛擬機器會嘗試立即執行 Port 任務,從而提高延遲,但會犧牲並行性。預設值可以在系統啟動時透過將命令列引數+spp
傳遞給 erl 來設定。{busy_limits_port, {Low, High} | disabled}
- 設定將用於控制 Port 忙碌狀態的限制。當 Port 的內部輸出佇列大小變得大於或等於
High
位元組時,它會進入忙碌狀態。當它變得小於Low
位元組時,它會離開忙碌狀態。當 Port 處於忙碌狀態時,傳送命令到它的程序將會被暫停,直到 Port 離開忙碌狀態。在此上下文中,命令可以是Port ! {Owner, {command, Data}}
或port_command/[2,3]
。如果
Low
限制設定大於High
,則會自動調整為與High
相同。Low
和High
的有效值範圍為[1, (1 bsl (8*erlang:system_info(wordsize)))-2]
。如果傳遞原子disabled
,則 Port 永遠不會進入忙碌狀態。預設值為
Low = 4096
和High = 8192
。請注意,此選項僅在透過開啟 spawn 驅動程式並開啟
fd
驅動程式來產生可執行檔(Port 程式)時有效。開啟其他驅動程式時,此選項將會導致badarg
例外狀況失敗。{busy_limits_msgq, {Low, High} | disabled}
- 設定將用於控制 Port 訊息佇列忙碌狀態的限制。當 Port 訊息佇列大小變得大於或等於
High
位元組時,它會進入忙碌狀態。當它變得小於Low
位元組時,它會離開忙碌狀態。當 Port 訊息佇列處於忙碌狀態時,傳送命令到它的程序將會被暫停,直到 Port 訊息佇列離開忙碌狀態。在此上下文中,命令可以是Port ! {Owner, {command, Data}}
或port_command/[2,3]
。如果
Low
限制設定大於High
,則會自動調整為與High
相同。Low
和High
的有效值範圍為[1, (1 bsl (8*erlang:system_info(wordsize)))-2]
。如果傳遞原子disabled
,則 Port 訊息佇列永遠不會進入忙碌狀態。請注意,如果驅動程式靜態地停用了此功能,除非此選項也設定為
disable
或根本未傳遞,否則將會引發badarg
例外狀況失敗。預設值為
Low = 4096
和High = 8192
,除非驅動程式本身會修改這些值。請注意,如果驅動程式也自行調整這些限制,而且您已停用此功能,則可能會失敗。
spawn 驅動程式(在產生可執行檔時使用)和
fd
驅動程式不會停用此功能,也不會自行調整這些限制。如需更多資訊,請參閱文件
erl_drv_busy_msgq_limits()
。
所有 Port 類型的預設值為 stream
,而產生的 Port 的預設值為 use_stdio
。
失敗:如果無法開啟 Port,則結束原因是 badarg
、system_limit
或最能描述錯誤的 POSIX 錯誤代碼,或者如果沒有適用的 POSIX 代碼,則為 einval
badarg
-open_port
的輸入引數錯誤。system_limit
- Erlang 模擬器中的所有可用 Port 都在使用中。enomem
- 沒有足夠的記憶體來建立 Port。eagain
- 沒有更多可用的作業系統程序。enametoolong
- 外部命令過長。emfile
- 沒有更多可用的檔案描述符(適用於執行 Erlang 模擬器的作業系統程序)。enfile
- 完整檔案表(適用於整個作業系統)。eacces
-{spawn_executable, Command}
中指定的Command
並未指向可執行檔。enoent
-{spawn_executable, FileName}
中指定的FileName
並未指向現有檔案。
在使用透過 {spawn, Name}
、{spawn_driver, Name}
或 {spawn_executable, Name}
開啟的 Port 時,將訊息傳送至它時發生的錯誤,會使用格式為 {'EXIT', Port, PosixCode}
的訊號回報給擁有程序。有關 PosixCode
的可能值,請參閱 file
。
-spec port_call(Port, Operation, Data) -> term() when Port :: port() | atom(), Operation :: integer(), Data :: term().
對埠執行同步呼叫。Operation
和 Data
的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此功能。
Port
是指驅動程式的 Port 識別碼。
Operation
是一個整數,會傳遞給驅動程式。
Data
是任何 Erlang 項。此資料會轉換為二進位項格式,並傳送至 Port。
從驅動程式傳回一個項。傳回資料的意義也取決於 Port 驅動程式。
失敗
badarg
- 如果Port
不是開啟 Port 的識別碼,或開啟 Port 的已註冊名稱。如果呼叫程序先前已連結到由Port
識別的關閉 Port,則保證在發生此badarg
例外狀況之前傳遞來自 Port 的結束訊號。badarg
- 如果Operation
不適合 32 位元整數。badarg
- 如果 Port 驅動程式不支援同步控制操作。badarg
- 如果 Port 驅動程式因任何原因決定這樣做(可能是Operation
或Data
有問題)。警告
請勿使用未知的
Port
識別碼呼叫port_call
並期望badarg
例外狀況。根據 Port 驅動程式如何解釋提供的引數,可能會發生任何未定義的行為(包括節點崩潰)。
關閉開啟的埠。大致與 Port ! {self(), close}
相同,但錯誤行為(請參閱下方)、同步,且埠不會以 {Port, closed}
回覆除外。
任何程序都可以使用 port_close/1
關閉 Port,而不僅僅是 Port 擁有者(連線的程序)。如果呼叫程序連結到由 Port
識別的 Port,則保證在 port_close/1
傳回之前傳遞來自 Port 的結束訊號。
為了比較:如果 Port
不是指向一個埠或一個程序,則 Port ! {self(), close}
才會因為 badarg
而失敗。如果 Port
是一個已關閉的埠,則不會發生任何事。如果 Port
是一個開啟的埠,且呼叫程序是該埠的擁有者,則當所有緩衝區都已清空且埠真正關閉時,該埠會回覆 {Port, closed}
。如果呼叫程序不是該埠的擁有者,則埠擁有者會因 badsig
而失敗。
請注意,任何程序都可以使用 Port ! {PortOwner, close}
來關閉埠,就像它本身是埠的擁有者一樣,但回覆總是會傳給埠的擁有者。
從 Erlang/OTP R16 開始,Port ! {PortOwner, close}
才是真正的非同步。請注意,此操作一直被記錄為非同步操作,但底層實作卻是同步的。port_close/1
仍然是完全同步的,因為它有錯誤行為。
失敗:如果 Port
不是一個開啟埠的識別符,或一個開啟埠的註冊名稱,則會產生 badarg
。如果呼叫程序先前已連結到由 Port
所識別的已關閉埠,則保證在發生此 badarg
異常之前,會傳送來自該埠的結束訊號。
向埠傳送資料。與 Port ! {PortOwner, {command, Data}}
相同,但錯誤行為和同步(請參閱下方)除外。
任何程序都可以使用 port_command/2
將資料傳送到埠,而不僅限於埠的擁有者(已連線的程序)。
為了比較:如果 Port
不是指向一個埠或一個程序,則 Port ! {PortOwner, {command, Data}}
才會因為 badarg
而失敗。如果 Port
是一個已關閉的埠,則資料訊息會無聲無息地消失。如果 Port
是開啟的,且呼叫程序不是埠的擁有者,則埠擁有者會因 badsig
而失敗。如果 Data
是無效的 I/O 清單,埠擁有者也會因 badsig
而失敗。
請注意,任何程序都可以使用 Port ! {PortOwner, {command, Data}}
向埠傳送訊息,就像它本身是埠的擁有者一樣。
如果埠正忙碌,則呼叫程序會暫停,直到埠不再忙碌。
從 Erlang/OTP R16 開始,Port ! {PortOwner, {command, Data}}
才是真正的非同步。請注意,此操作一直被記錄為非同步操作,但底層實作卻是同步的。port_command/2
仍然是完全同步的,因為它有錯誤行為。
失敗
badarg
- 如果Port
不是開啟 Port 的識別碼,或開啟 Port 的已註冊名稱。如果呼叫程序先前已連結到由Port
識別的關閉 Port,則保證在發生此badarg
例外狀況之前傳遞來自 Port 的結束訊號。badarg
- 如果Data
是無效的 I/O 清單。
警告
不要將資料傳送到未知的埠。任何未定義的行為都是有可能的(包括節點崩潰),具體取決於埠驅動程式如何解譯資料。
-spec port_command(Port, Data, OptionList) -> boolean() when Port :: port() | atom(), Data :: iodata(), Option :: force | nosuspend, OptionList :: [Option].
向埠傳送資料。port_command(Port, Data, [])
等於 port_command(Port, Data)
。
如果埠命令被中止,則會傳回 false
,否則會傳回 true
。
如果埠正忙碌,則呼叫程序會暫停,直到埠不再忙碌。
Option
選項
force
- 如果埠正忙碌,則不會暫停呼叫程序,而是強制執行埠命令。如果埠的驅動程式不支援此功能,則呼叫會失敗並產生notsup
異常。如需更多資訊,請參閱驅動程式標誌ERL_DRV_FLAG_SOFT_BUSY
。nosuspend
- 如果埠正忙碌,則不會暫停呼叫程序,而是中止埠命令並傳回false
。
變更
未來版本可能會新增更多選項。
失敗
badarg
- 如果Port
不是開啟 Port 的識別碼,或開啟 Port 的已註冊名稱。如果呼叫程序先前已連結到由Port
識別的關閉 Port,則保證在發生此badarg
例外狀況之前傳遞來自 Port 的結束訊號。badarg
- 如果Data
是無效的 I/O 清單。badarg
- 如果OptionList
是無效的選項清單。notsup
- 如果已傳遞選項force
,但埠的驅動程式不允許強制執行忙碌的埠。
警告
不要將資料傳送到未知的埠。任何未定義的行為都是有可能的(包括節點崩潰),具體取決於埠驅動程式如何解譯資料。
將埠的所有者(已連接的埠)設定為 Pid
。大致與 Port ! {Owner, {connect, Pid}}
相同,但以下除外
- 錯誤行為有所不同,請參閱下方。
- 埠不會回覆
{Port,connected}
。 port_connect/1
是同步的,請參閱下方。- 新的埠擁有者會連結到該埠。
舊的埠擁有者仍會連結到該埠,如果不需要,必須呼叫 unlink(Port)
。任何程序都可以使用 port_connect/2
將埠的擁有者設定為任何程序。
為了比較:如果 Port
不是指向一個埠或一個程序,則 Port ! {self(), {connect, Pid}}
才會因為 badarg
而失敗。如果 Port
是一個已關閉的埠,則不會發生任何事。如果 Port
是一個開啟的埠,且呼叫程序是該埠的擁有者,則該埠會向舊的埠擁有者回覆 {Port, connected}
。請注意,舊的埠擁有者仍會連結到該埠,而新的擁有者則不會。如果 Port
是一個開啟的埠,且呼叫程序不是埠的擁有者,則埠擁有者會因 badsig
而失敗。如果 Pid
不是現有的本機程序識別符,埠擁有者也會因 badsig
而失敗。
請注意,任何程序都可以使用 Port ! {PortOwner, {connect, Pid}}
來設定埠的擁有者,就像它本身是埠的擁有者一樣,但回覆總是會傳給埠的擁有者。
從 Erlang/OTP R16 開始,Port ! {PortOwner, {connect, Pid}}
才是真正的非同步。請注意,此操作一直被記錄為非同步操作,但底層實作卻是同步的。port_connect/2
仍然是完全同步的,因為它有錯誤行為。
失敗
badarg
- 如果Port
不是開啟 Port 的識別碼,或開啟 Port 的已註冊名稱。如果呼叫程序先前已連結到由Port
識別的關閉 Port,則保證在發生此badarg
例外狀況之前傳遞來自 Port 的結束訊號。badarg
- 如果由Pid
所識別的程序不是現有的本機程序。
-spec port_control(Port, Operation, Data) -> iodata() | binary() when Port :: port() | atom(), Operation :: integer(), Data :: iodata().
對埠執行同步控制操作。Operation
和 Data
的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此控制功能。
根據埠驅動程式,會傳回 0..255 範圍內的整數清單,或一個二進制資料。傳回資料的意義也取決於埠驅動程式。
失敗
badarg
- 如果Port
不是一個開啟的埠,或一個開啟埠的註冊名稱。badarg
- 如果Operation
無法放入 32 位元的整數中。badarg
- 如果 Port 驅動程式不支援同步控制操作。badarg
- 如果 Port 驅動程式因任何原因決定這樣做(可能是Operation
或Data
有問題)。警告
請勿使用未知的
Port
識別符呼叫port_control/3
,並期望產生badarg
異常。任何未定義的行為都是有可能的(包括節點崩潰),具體取決於埠驅動程式如何解譯提供的引數。
-spec port_info(Port) -> Result when Port :: port() | atom(), ResultItem :: {registered_name, RegisteredName :: atom()} | {id, Index :: non_neg_integer()} | {connected, Pid :: pid()} | {links, Pids :: [pid()]} | {name, String :: string()} | {input, Bytes :: non_neg_integer()} | {output, Bytes :: non_neg_integer()} | {os_pid, OsPid :: non_neg_integer() | undefined}, Result :: [ResultItem] | undefined.
回傳包含有關 Port
的資訊的元組列表,如果埠未開啟,則回傳 undefined
。
元組的順序是未定義的,且並非所有元組都是必要的。如果埠已關閉,且呼叫程序先前已連結到該埠,則保證在 port_info/1
傳回 undefined
之前,會傳送來自該埠的結束訊號。
結果包含以下 Item
的相關資訊
registered_name
(如果埠有註冊名稱)id
connected
links
name
input
output
如需有關不同 Item
的更多資訊,請參閱 port_info/2
。
失敗:如果 Port
不是本機埠識別符,或一個原子,則會產生 badarg
。
-spec port_info(Port, Item :: connected) -> {connected, Pid} | undefined when Port :: port() | atom(), Pid :: pid(); (Port, Item :: id) -> {id, Index} | undefined when Port :: port() | atom(), Index :: non_neg_integer(); (Port, Item :: input) -> {input, Bytes} | undefined when Port :: port() | atom(), Bytes :: non_neg_integer(); (Port, Item :: links) -> {links, Pids} | undefined when Port :: port() | atom(), Pids :: [pid()]; (Port, Item :: locking) -> {locking, Locking} | undefined when Port :: port() | atom(), Locking :: false | port_level | driver_level; (Port, Item :: memory) -> {memory, Bytes} | undefined when Port :: port() | atom(), Bytes :: non_neg_integer(); (Port, Item :: monitors) -> {monitors, Monitors} | undefined when Port :: port() | atom(), Monitors :: [{process, pid()}]; (Port, Item :: monitored_by) -> {monitored_by, MonitoredBy} | undefined when Port :: port() | atom(), MonitoredBy :: [pid()]; (Port, Item :: name) -> {name, Name} | undefined when Port :: port() | atom(), Name :: string(); (Port, Item :: os_pid) -> {os_pid, OsPid} | undefined when Port :: port() | atom(), OsPid :: non_neg_integer() | undefined; (Port, Item :: output) -> {output, Bytes} | undefined when Port :: port() | atom(), Bytes :: non_neg_integer(); (Port, Item :: parallelism) -> {parallelism, Boolean} | undefined when Port :: port() | atom(), Boolean :: boolean(); (Port, Item :: queue_size) -> {queue_size, Bytes} | undefined when Port :: port() | atom(), Bytes :: non_neg_integer(); (Port, Item :: registered_name) -> {registered_name, RegisteredName} | [] | undefined when Port :: port() | atom(), RegisteredName :: atom().
回傳有關 Port
的資訊。
如果由 Port
所識別的埠未開啟,則會傳回 undefined
。如果埠已關閉,且呼叫程序先前已連結到該埠,則保證在 port_info/2
傳回 undefined
之前,會傳送來自該埠的結束訊號。
Item
是下列其中一項,可用於取得有關 Port
的各種資訊。
connected
- 傳回{connected, Pid}
,其中Pid
是連結到該埠的程序的程序識別符。id
- 傳回{id, Index}
,其中Index
是埠的內部索引。此索引可用於區分不同的埠。input
- 傳回{input, Bytes}
,其中Bytes
是從埠讀取的總位元組數。links
- 傳回{links, Pids}
,其中Pids
是埠連結到的程序的程序識別符清單。locking
- 傳回{locking, Locking}
,其中Locking
是下列其中一項port_level
(埠特定鎖定)driver_level
(驅動程式特定鎖定)請注意,這些結果是高度與實作相關的,並且可能會在未來的版本中變更。
自:OTP R16B 起
memory
- 傳回{memory, Bytes}
,其中Bytes
是執行階段系統為此埠配置的總位元組數。埠本身可能已配置記憶體,但未包含在Bytes
中。自:OTP R16B 起
monitors
- 傳回{monitors, Monitors}
,其中Monitors
代表此埠監控的程序。自:OTP R16B 起
monitored_by
- 傳回{monitored_by, MonitoredBy}
,其中MonitoredBy
是目前正在監控指定埠的 pid 清單。自:OTP 19.0 起
name
- 傳回{name, Name}
,其中Name
是由open_port/2
設定的命令名稱。os_pid
- 返回{os_pid, OsPid}
,其中OsPid
是使用open_port({spawn | spawn_executable, Command}, Options)
建立的作業系統行程的行程識別碼(或等效值)。如果埠不是衍生作業系統行程的結果,則值為undefined
。自:OTP R16B 起
output
- 返回{output, Bytes}
,其中Bytes
是從 Erlang 行程使用port_command/2
、port_command/3
或Port ! {Owner, {command, Data}
寫入到埠的總位元組數。parallelism
- 返回{parallelism, Boolean}
,其中Boolean
對應於此埠使用的埠平行性提示。有關詳細資訊,請參閱open_port/2
的選項parallelism
。自:OTP R16B 起
queue_size
- 返回{queue_size, Bytes}
,其中Bytes
是使用 ERTS 驅動程式佇列實作,由埠排隊的總位元組數。自:OTP R16B 起
registered_name
- 返回{registered_name, RegisteredName}
,其中RegisteredName
是埠的註冊名稱。如果埠沒有註冊名稱,則返回[]
。
失敗:如果 Port
不是本機埠識別符,或一個原子,則會產生 badarg
。
-spec ports() -> [port()].
回傳與本機節點上存在的所有埠對應的埠識別符列表。
請注意,正在退出的埠存在,但未開啟。
-spec process_display(Pid, Type) -> true when Pid :: pid(), Type :: backtrace.
在 標準錯誤 上寫入有關本機程序 Pid
的資訊。
原子 Type
的唯一允許值是 backtrace
,它顯示呼叫堆疊的內容,包括有關呼叫鏈的資訊,並首先列印目前函式。輸出的格式未進一步定義。
-spec process_flag(async_dist, Boolean) -> OldBoolean when Boolean :: boolean(), OldBoolean :: boolean(); (trap_exit, Boolean) -> OldBoolean when Boolean :: boolean(), OldBoolean :: boolean(); (error_handler, Module) -> OldModule when Module :: atom(), OldModule :: atom(); (fullsweep_after, FullsweepAfter) -> OldFullsweepAfter when FullsweepAfter :: non_neg_integer(), OldFullsweepAfter :: non_neg_integer(); (min_heap_size, MinHeapSize) -> OldMinHeapSize when MinHeapSize :: non_neg_integer(), OldMinHeapSize :: non_neg_integer(); (min_bin_vheap_size, MinBinVHeapSize) -> OldMinBinVHeapSize when MinBinVHeapSize :: non_neg_integer(), OldMinBinVHeapSize :: non_neg_integer(); (max_heap_size, MaxHeapSize) -> OldMaxHeapSize when MaxHeapSize :: max_heap_size(), OldMaxHeapSize :: max_heap_size(); (message_queue_data, MQD) -> OldMQD when MQD :: message_queue_data(), OldMQD :: message_queue_data(); (priority, Level) -> OldLevel when Level :: priority_level(), OldLevel :: priority_level(); (save_calls, N) -> OldN when N :: 0..10000, OldN :: 0..10000; (sensitive, Boolean) -> OldBoolean when Boolean :: boolean(), OldBoolean :: boolean(); ({monitor_nodes, term()}, term()) -> term(); (monitor_nodes, term()) -> term().
將指定的程序旗標設定為指定的值。回傳旗標的先前值。
Flag
是以下其中之一
process_flag(async_dist, boolean())
為呼叫行程啟用或停用完全非同步分散式訊號。停用時(預設情況下),如果分發通道的緩衝區達到分發緩衝區忙碌限制,則傳送分散式訊號的行程將在傳送操作中遭到封鎖。該行程將保持封鎖狀態,直到緩衝區縮小到足夠小為止。在某些情況下,這可能需要相當長的時間。啟用
async_dist
時,分散式訊號的傳送操作將始終在傳出的分發通道上緩衝訊號,然後立即返回。也就是說,這些傳送操作永遠不會封鎖傳送行程。注意
由於在啟用
async_dist
行程旗標時,執行階段系統不強制執行流量控制,因此您需要確保實作此類資料的流量控制,或者此類資料量已知始終受到限制。在沒有流量控制的情況下啟用async_dist
的無限訊號傳輸通常會導致傳送執行階段系統在記憶體不足的情況下崩潰。可以使用
erlang:system_monitor()
和busy_dist_port
選項監控由於停用async_dist
而導致的封鎖。在確定操作是否應封鎖呼叫端時,僅計算在(傳送訊號時)停用了async_dist
的行程緩衝的資料。也可以在使用
spawn_opt()
BIF 和選項{async_dist, Enable}
衍生新行程時,於新行程上設定async_dist
旗標。可以在啟動執行階段系統時,傳遞命令列引數+pad <boolean>
,設定要在新衍生行程上使用的預設async_dist
旗標。如果未傳遞+pad <boolean>
命令列引數,async_dist
旗標的預設值將為false
。您可以透過呼叫
process_info(Pid, async_dist)
來檢查行程的async_dist
行程旗標的狀態。process_flag(trap_exit, boolean())
當
trap_exit
設定為true
時,到達行程的結束訊號會轉換為{'EXIT', From, Reason}
訊息,這些訊息可以像普通訊息一樣接收。如果trap_exit
設定為false
,則行程在收到normal
以外的結束訊號時會結束,並且結束訊號會傳播到其連結的行程。應用程式行程通常不會捕獲結束訊號。另請參閱
exit/2
。process_flag(error_handler, module())
由行程使用來重新定義未定義函式呼叫和未定義的註冊行程的
error_handler
。請謹慎使用此旗標,因為程式碼自動載入取決於錯誤處理模組的正確操作。process_flag(fullsweep_after, non_neg_integer())
變更在強制呼叫行程進行完整清除之前的最大世代收集次數。
process_flag(min_heap_size, non_neg_integer())
變更呼叫行程的最小堆積大小。
process_flag(min_bin_vheap_size, non_neg_integer())
變更呼叫行程的最小二進位虛擬堆積大小。
process_flag(max_heap_size, max_heap_size())
此旗標設定呼叫行程的最大堆積大小。如果
MaxHeapSize
是整數,則會使用kill
和error_logger
的系統預設值。有關堆積如何增長的詳細資訊,請參閱 ERTS 內部文件中的調整堆積大小。
size
- 行程的最大大小(以字為單位)。如果設定為零,則會停用堆積大小限制。如果該值小於min_heap_size
,則會擲回badarg
。僅當觸發垃圾收集時,才會執行大小檢查。size
是觸發垃圾收集時的整個行程堆積。這包括所有世代堆積、行程堆疊、被視為堆積一部分的訊息,以及垃圾收集器在收集期間需要的任何額外記憶體。size
與使用erlang:process_info(Pid, total_heap_size)
擷取或透過新增erlang:process_info(Pid, garbage_collection_info)
中的heap_block_size
、old_heap_block_size
和mbuf_size
所取得的大小相同。kill
- 設定為true
時,如果達到最大堆積大小,執行階段系統會向行程傳送帶有原因kill
的不可捕獲結束訊號。觸發kill
的垃圾收集不會完成,而是行程會盡快結束。設定為false
時,不會向行程傳送結束訊號,而是行程會繼續執行。如果未在地圖中定義
kill
,則將使用系統預設值。預設系統預設值為true
。可以使用 +hmaxk 選項(在 erl 中)或erlang:system_flag(max_heap_size, MaxHeapSize)
變更它。error_logger
- 設定為true
時,當達到最大堆積大小時,執行階段系統會透過logger
記錄錯誤事件,其中包含有關行程的詳細資訊。每次達到限制時都會傳送一個記錄事件。如果未在地圖中定義
error_logger
,則使用系統預設值。預設系統預設值為true
。可以使用 +hmaxel 選項(在 erl 中)或erlang:system_flag(max_heap_size, MaxHeapSize)
變更它。include_shared_binaries
- 設定為true
時,場外二進位檔會包含在與size
限制進行比較的總和中。場外二進位檔通常是較大的二進位檔,可以在行程之間共用。共用二進位檔的大小由所有參照它的行程包含。此外,即使行程僅參照較小的部分,也可能包含大型二進位檔的整個大小。如果未在地圖中定義
include_shared_binaries
,則使用系統預設值。預設系統預設值為false
。可以使用 +hmaxib 選項(在 erl 中)或erlang:system_flag(max_heap_size, MaxHeapSize)
變更它。
行程的堆積大小很難預測,尤其是在垃圾收集期間使用的記憶體量。當考慮使用此選項時,建議先在生產環境中將
kill
設定為false
執行它,並檢查記錄事件,以查看系統中行程的正常峰值大小,然後相應地調整值。process_flag(message_queue_data, message_queue_data())
決定如何儲存訊息佇列中的訊息,如下所示
off_heap
- 訊息佇列中的所有訊息都將儲存在行程堆積之外。這表示訊息佇列中的沒有訊息將是行程垃圾收集的一部分。on_heap
- 訊息佇列中的所有訊息最終都將放置在行程堆積上。但是,它們可以暫時儲存在堆積之外。這是直到 ERTS 8.0 為止,訊息的儲存方式。
message_queue_data
行程旗標的預設值由 erl 中的命令列引數+hmqd
決定。如果行程可能會在其佇列中累積大量訊息,則建議將旗標值設定為
off_heap
。這是因為在堆積上儲存大量訊息的行程的垃圾收集可能會變得非常昂貴,並且行程可能會消耗大量記憶體。但是,當旗標值為on_heap
時,實際訊息傳遞的效能通常會更好。變更旗標值會導致任何現有的訊息被移動。移動操作會被啟動,但不一定會在函式返回時完成。
process_flag(priority, priority_level())
設定行程的優先權。
Level
是一個原子。存在四個優先權級別:low
、normal
、high
和max
。預設值為normal
。注意
優先權級別
max
保留給 Erlang 執行時系統內部使用,不 應由其他程式使用。在每個優先權級別內部,行程會以循環配置的方式進行排程。
優先權為
normal
和low
的行程執行會交錯進行。優先權為low
的行程被選中執行的頻率低於優先權為normal
的行程。當存在優先權為
high
的可執行行程時,不會選擇執行優先權為low
或normal
的行程。但是請注意,這不 表示當優先權為high
的行程正在執行時,就沒有優先權為low
或normal
的行程可以執行。當使用多個排程器時,可以並行執行的行程數量可能多於優先權為high
的行程數量。也就是說,一個優先權為low
的行程和一個優先權為high
的行程可以同時執行。當存在優先權為
max
的可執行行程時,不會選擇執行優先權為low
、normal
或high
的行程。與優先權high
相同,較低優先權的行程可以與優先權為max
的行程並行執行。排程是搶佔式的。無論優先權為何,當一個行程自上次被選中執行以來消耗了超過特定數量的歸約時,該行程都會被搶佔。
注意
不要依賴於今天的排程方式完全保持不變。排程很可能會在未來的版本中更改,以便更好地利用可用的處理器核心。
沒有自動機制可以避免優先權反轉,例如優先權繼承或優先權上限。當使用優先權時,請考慮這一點並自行處理此類情況。
從優先權為
high
的行程呼叫您無法控制的程式碼可能會導致優先權為high
的行程等待優先權較低的行程。也就是說,在呼叫期間有效地降低了優先權為high
的行程的優先權。即使在您無法控制的某個程式碼版本中情況並非如此,在未來的版本中也可能會發生這種情況。例如,如果優先權為high
的行程觸發程式碼載入,則可能會發生這種情況,因為程式碼伺服器會在優先權normal
下執行。通常不需要
normal
以外的優先權。當使用其他優先權時,請謹慎使用,尤其 是優先權high
。優先權為high
的行程僅應在短時間內執行工作。在優先權為high
的行程中長時間忙迴圈很可能會導致問題,因為重要的 OTP 伺服器會在優先權normal
下執行。process_flag(save_calls, 0..10000)
N
必須是 0..10000 範圍內的整數。如果N
> 0,則會啟用該行程的呼叫儲存。這表示有關行程最近N
個全域函式呼叫、BIF 呼叫、傳送和接收的資訊會儲存在一個清單中,可以使用process_info(Pid, last_calls)
擷取。全域函式呼叫是指明確提及函式模組的呼叫。只會儲存固定數量的資訊,如下所示:- 函式呼叫的元組
{Module, Function, Arity}
- 傳送和接收的原子
send
、'receive'
和timeout
(當接收到訊息時為'receive'
,當接收逾時時為timeout
)
如果
N
= 0,則會停用該行程的呼叫儲存,這是預設值。每當設定呼叫儲存清單的大小時,其內容都會重設。- 函式呼叫的元組
process_flag(sensitive, boolean())
為目前的行程設定或清除旗標
sensitive
。當行程透過呼叫process_flag(sensitive, true)
標記為敏感時,執行時系統中可以用於檢查行程的資料或內部運作的功能會被靜默停用。停用的功能包括(但不限於)下列功能:
- 追蹤。仍然可以為行程設定追蹤旗標,但不會產生任何類型的追蹤訊息。(如果關閉旗標
sensitive
,則如果設定了任何追蹤旗標,則會再次產生追蹤訊息。) - 循序追蹤。循序追蹤權杖會照常傳播,但不會產生循序追蹤訊息。
process_info/1,2
無法用於讀取訊息佇列或行程字典(兩者都會傳回空清單)。無法為行程顯示堆疊回溯追蹤。
在當機傾印中,會省略堆疊、訊息和行程字典。
如果已為行程設定
{save_calls,N}
,則不會將函式呼叫儲存到呼叫儲存清單。(呼叫儲存清單不會清除。此外,傳送、接收和逾時事件仍會新增至清單。)- 追蹤。仍然可以為行程設定追蹤旗標,但不會產生任何類型的追蹤訊息。(如果關閉旗標
-spec process_flag(Pid, Flag, Value) -> OldValue when Pid :: pid(), Flag :: save_calls, Value :: non_neg_integer(), OldValue :: non_neg_integer().
以與 process_flag/2
相同的方式,為程序 Pid
設定某些旗標。回傳旗標的舊值。 Flag
的有效值僅為 process_flag/2
中允許的值的子集,即 save_calls
。
失敗:如果 Pid
不是本機行程,則為 badarg
。
-spec process_info(Pid) -> Info when Pid :: pid(), Info :: [InfoTuple] | undefined, InfoTuple :: process_info_result_item().
回傳包含有關 Pid
所識別的程序的各種資訊的 InfoTuple
列表,如果程序未執行,則回傳 undefined
。
InfoTuple
的順序未定義,而且並非所有 InfoTuple
都是必要的。結果的 InfoTuple
部分可能會在沒有事先通知的情況下變更。
具有下列項目的 InfoTuple
是結果的一部分:
current_function
initial_call
status
message_queue_len
links
dictionary
trap_exit
error_handler
priority
group_leader
total_heap_size
heap_size
stack_size
reductions
garbage_collection
如果由 Pid
識別的行程具有已註冊的名稱,則也會包含一個具有項目 registered_name
的 InfoTuple
。
有關特定 InfoTuple
的資訊,請參閱 process_info/2
。
警告
此 BIF 僅適用於除錯。對於所有其他用途,請使用
process_info/2
。
失敗:如果 Pid
不是本機行程,則為 badarg
。
-spec process_info(Pid, Item) -> InfoTuple | [] | undefined when Pid :: pid(), Item :: process_info_item(), InfoTuple :: process_info_result_item(); (Pid, ItemList) -> InfoTupleList | [] | undefined when Pid :: pid(), ItemList :: [Item], Item :: process_info_item(), InfoTupleList :: [InfoTuple], InfoTuple :: process_info_result_item().
回傳有關 Pid
所識別的程序的資訊,由 Item
或 ItemList
指定。如果程序未執行,則回傳 undefined
。
如果行程處於活動狀態且指定了單個 Item
,則傳回的值是對應的 InfoTuple
,除非 Item =:= registered_name
且行程沒有已註冊的名稱。在這種情況下,會傳回 []
。此奇怪的行為是出於歷史原因,並為了向後相容性而保留。
如果指定了 ItemList
,則結果為 InfoTupleList
。InfoTupleList
中的 InfoTuple
會與 ItemList
中包含的對應 Item
按照相同的順序包含。有效的 Item
可以多次包含在 ItemList
中。
取得行程資訊會遵循Erlang 參考手冊中行程章節中所述的訊號排序保證。
注意
如果
registered_name
是ItemList
的一部分,且行程沒有註冊的名稱,則{registered_name, []}
、InfoTuple
將 會包含在結果InfoTupleList
中。當指定單個Item =:= registered_name
時,以及當使用process_info/1
時,此行為有所不同。
具有對應 Item
的有效 InfoTuple
:
{async_dist, Enabled}
- 自:OTP 25.3 起async_dist
行程旗標的目前值。{backtrace, Bin}
- 二進位Bin
包含與erlang:process_display(Pid, backtrace)
的輸出相同的資訊。使用binary_to_list/1
從二進位取得字元字串。{binary, BinInfo}
-BinInfo
是一個清單,其中包含有關此行程堆積上二進位的雜項資訊。此InfoTuple
可以在沒有事先通知的情況下變更或移除。在目前的實作中,BinInfo
是一個元組清單。元組包含:BinaryId
、BinarySize
、BinaryRefcCount
。根據
message_queue_data
行程旗標的值,訊息佇列可能會儲存在堆積上。{catchlevel, CatchLevel}
-CatchLevel
是此行程中目前活動的 catch 數量。此InfoTuple
可以在沒有事先通知的情況下變更或移除。{current_function, {Module, Function, Arity} | undefined}
-Module
、Function
、Arity
是行程的目前函式呼叫。如果行程目前正在執行原生編譯程式碼,則可能會傳回值undefined
。{current_location, {Module, Function, Arity, Location}}
-Module
、Function
、Arity
是行程的目前函式呼叫。Location
是一個描述原始程式碼位置的雙元組清單。{current_stacktrace, Stack}
- 傳回行程的目前呼叫堆疊回溯追蹤(堆疊追蹤)。堆疊的格式與try
的catch
部分中的格式相同。請參閱呼叫堆疊回溯追蹤(堆疊追蹤)。堆疊追蹤的深度會根據backtrace_depth
系統旗標設定截斷。{dictionary, Dictionary}
-Dictionary
是行程字典。{{dictionary, Key}, Value}
- 與程序字典中Key
相關聯的Value
。{error_handler, Module}
-Module
是程序所使用的error_handler
模組 (例如,用於未定義的函數呼叫)。{garbage_collection, GCInfo}
-GCInfo
是一個包含此程序垃圾回收相關雜項資訊的列表。GCInfo
的內容可能會在未事先通知的情況下變更。{garbage_collection_info, GCInfo}
-GCInfo
是一個包含此程序垃圾回收相關詳細雜項資訊的列表。GCInfo
的內容可能會在未事先通知的情況下變更。關於每個項目的含義的詳細資訊,請參閱gc_minor_start
中的trace:process/4
。{group_leader, GroupLeader}
-GroupLeader
是程序的 I/O 群組領導者。{heap_size, Size}
-Size
是程序最年輕的堆積代的字組大小。 此代包含程序堆疊。此資訊高度依賴於實作方式,如果實作方式變更,則可能會變更。{initial_call, {Module, Function, Arity}}
-Module
、Function
、Arity
是程序產生時的初始函數呼叫。{links, PidsAndPorts}
-PidsAndPorts
是一個程序識別碼和埠識別碼的列表,其中包含程序連結到的程序或埠。{label, Label}
-Label
是程序的標籤。請參閱proc_lib:get_label/1
。自:OTP 27.2
{last_calls, false|Calls}
- 如果未啟用程序的呼叫儲存 (請參閱process_flag/3
),則該值為false
。如果已啟用呼叫儲存,則會傳回一個列表,其中最後一個元素是最近呼叫的。{message_queue_len, MessageQueueLen}
-MessageQueueLen
是目前在程序訊息佇列中的訊息數量。這是作為資訊項目messages
傳回的列表MessageQueue
的長度 (請參閱下方)。{messages, MessageQueue}
-MessageQueue
是尚未處理的程序訊息列表。{min_heap_size, MinHeapSize}
-MinHeapSize
是程序的最小堆積大小。{min_bin_vheap_size, MinBinVHeapSize}
-MinBinVHeapSize
是程序的最小二進位虛擬堆積大小。{monitored_by, MonitoredBy}
- 監視該程序的所有程序、埠和 NIF 資源的識別碼列表。{monitors, Monitors}
- 為程序啟用的監視器列表 (由monitor/2
啟動)。對於本機程序監視器或透過程序識別碼的遠端程序監視器,該列表包含{process, Pid}
- 程序由 pid 監視。{process, {RegName, Node}}
- 本機或遠端程序由名稱監視。{port, PortId}
- 本機埠由埠識別碼監視。{port, {RegName, Node}}
- 本機埠由名稱監視。請注意,不支援遠端埠監視器,因此Node
將永遠是本機節點名稱。
{message_queue_data, MQD}
-MQD
是message_queue_data
程序標誌的目前值,其值可以是off_heap
或on_heap
。如需更多資訊,請參閱process_flag(message_queue_data, MQD)
的文件。{parent, Pid}
-Pid
是父程序的識別碼,也就是產生目前程序的程序。當程序沒有父程序時,會傳回undefined
。只有節點上的初始程序 (init
) 沒有父程序。{priority, Level}
-Level
是程序的目前優先順序層級。如需關於優先順序的更多資訊,請參閱process_flag(priority, Level)
。{reductions, Number}
-Number
是程序執行的縮減次數。{registered_name, Atom}
-Atom
是已註冊的程序名稱。如果程序沒有已註冊的名稱,則此元組不會出現在列表中。{sequential_trace_token, [] | SequentialTraceToken}
-SequentialTraceToken
是程序的循序追蹤令牌。此InfoTuple
可以在未事先通知的情況下變更或移除。{stack_size, Size}
-Size
是程序的堆疊大小,以字組為單位。{status, Status}
-Status
是程序的狀態,並且是以下其中之一exiting (正在退出)
garbage_collecting (正在進行垃圾回收)
waiting
(等待訊息)running (正在執行)
runnable
(準備執行,但另一個程序正在執行)suspended
(暫停在「忙碌」的埠上,或由 BIFerlang:suspend_process/1,2
暫停)
{suspending, SuspendeeList}
-SuspendeeList
是一個{Suspendee, ActiveSuspendCount, OutstandingSuspendCount}
元組的列表。Suspendee
是已由Pid
識別的程序,透過 BIFerlang:suspend_process/2
或erlang:suspend_process/1
暫停,或將要暫停的程序的識別碼。ActiveSuspendCount
是Pid
暫停Suspendee
的次數。OutstandingSuspendCount
是Pid
發送但尚未完成的暫停請求數量,也就是說- 如果
ActiveSuspendCount =/= 0
,則Suspendee
目前處於暫停狀態。 - 如果
OutstandingSuspendCount =/= 0
,則已使用erlang:suspend_process/2
的asynchronous
選項,且暫停的程序尚未被Pid
暫停。
請注意,
ActiveSuspendCount
和OutstandingSuspendCount
並不是Suspendee
上的總暫停計數,僅是由Pid
貢獻的部分。- 如果
{total_heap_size, Size}
-Size
是程序所有堆積片段的總大小,以字組為單位。這包括程序堆疊和任何被認為是堆積一部分的未接收訊息。{trace, InternalTraceFlags}
-InternalTraceFlags
是一個代表此程序內部追蹤標誌的整數。此InfoTuple
可以在未事先通知的情況下變更或移除。{trap_exit, Boolean}
- 如果程序正在捕獲退出,則Boolean
為true
,否則為false
。
請注意,並非所有實作方式都支援所有這些 Item
。
失敗
badarg
- 如果Pid
不是本機程序。badarg
- 如果Item
是無效的項目。
-spec processes() -> [pid()].
回傳與本機節點上目前存在的所有程序對應的程序識別符列表。
請注意,正在退出的程序存在,但並非存活狀態。也就是說,is_process_alive/1
對於正在退出的程序會傳回 false
,但其程序識別碼是從 processes/0
傳回的結果的一部分。
範例
> processes().
[<0.0.0>,<0.2.0>,<0.4.0>,<0.5.0>,<0.7.0>,<0.8.0>]
將新的 Key
新增至程序字典,並與值 Val
相關聯,且回傳 undefined
。如果 Key
存在,則會刪除舊值並以 Val
取代,且函式會回傳舊值。
此函式目前實作的平均時間複雜度為 O(1
),最差情況下的時間複雜度為 O(N
),其中 N
是程序字典中的項目數量。
例如
> X = put(name, walrus), Y = put(name, carpenter),
Z = get(name),
{X, Y, Z}.
{undefined,walrus,carpenter}
注意
如果評估
throw
或發生錯誤,則在catch
範圍內評估put
時儲存的值不會被收回。
-spec raise(Class, Reason, Stacktrace) -> badarg when Class :: error | exit | throw, Reason :: term(), Stacktrace :: raise_stacktrace().
引發具有指定類別、原因和呼叫堆疊回溯(*堆疊追蹤*)的例外。
Class
是 error
、exit
或 throw
。因此,如果沒有堆疊追蹤,erlang:raise(Class, Reason, Stacktrace)
等效於 erlang:Class(Reason)
(前提是 Class
是有效類別)。
Reason
可以是任何項目。
Stacktrace
是 try-catch 子句中提供的列表。
try
...
catch Class:Reason:Stacktrace ->
...
end
也就是說,四元組 {Module, Function, Arity | Args, ExtraInfo}
的列表,其中 Module
和 Function
是原子,第三個元素是整數 arity 或引數列表。堆疊追蹤也可以包含 {Fun, Args, ExtraInfo}
元組,其中 Fun
是本機函式,而 Args
是引數列表。
結尾的元素 ExtraInfo
是可選的。省略它等同於指定一個空列表。
堆疊追蹤會用作呼叫程序的例外堆疊追蹤;它會被截斷為目前的最大堆疊追蹤深度。
由於評估此函數會導致進程終止,因此除非參數無效,否則它沒有傳回值。如果參數無效,函數會傳回錯誤原因 badarg
。如果您想要確定不會返回任何值,您可以呼叫 error(erlang:raise(Class, Reason, Stacktrace))
,並希望稍後能區分例外狀況。
關於例外類別以及如何捕獲例外狀況的更多資訊,請參閱關於錯誤和錯誤處理的參考手冊。
在 名稱註冊表
中使用程序識別符 (pid) 或埠識別符註冊名稱 RegName
。RegName
(必須是原子)可以用於傳送運算子 (RegName ! Message
) 和大多數其他以 pid 或埠識別符作為引數的 BIF 中,以取代 pid 或埠識別符。
例如
> register(db, Pid).
true
註冊名稱被視為直接可見的 Erlang 資源,並且會在進程終止時自動取消註冊。
失敗
badarg
- 如果PidOrPort
不是現有的本地進程或埠。badarg
- 如果RegName
已在使用中。badarg
- 如果進程或埠已註冊(已有名稱)。badarg
- 如果RegName
是原子undefined
。
-spec registered() -> [RegName] when RegName :: atom().
回傳使用 register/2
註冊的名稱列表。
例如
> registered().
[code_server, file_server, init, user, my_db]
-spec resume_process(Suspendee) -> true when Suspendee :: pid().
減少 Suspendee
所識別的程序的暫停計數。
Suspendee
先前必須透過呼叫 erlang:resume_process(Suspendee)
的進程,使用 erlang:suspend_process/2
或 erlang:suspend_process/1
暫停。當 Suspendee
的暫停計數達到零時,Suspendee
會恢復,也就是說,它的狀態會從暫停變更為暫停前的狀態。
警告
此 BIF 僅用於除錯目的。
失敗
badarg
- 如果Suspendee
不是進程識別符。badarg
- 如果呼叫erlang:resume_process/1
的進程先前沒有增加由Suspendee
識別的進程的暫停計數。badarg
- 如果由Suspendee
識別的進程未處於執行狀態。
-spec self() -> pid().
回傳呼叫程序的程序識別符。
例如
> self().
<0.26.0>
-spec send(Dest, Msg) -> Msg when Dest :: send_destination(), Msg :: term().
傳送訊息並回傳 Msg
。這與使用 傳送運算子 相同:Dest ! Msg
。
Dest
可以是遠端或本地進程識別符、別名、(本地) 埠、本地註冊名稱,或是在另一個節點上註冊名稱的元組 {RegName, Node}
。
如果 Dest
是原子名稱,但此名稱未註冊,則函數會失敗並產生 badarg
執行階段錯誤。這是 send
對於無法連線的目的地 Dest
(類型正確) 失敗的唯一情況。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
-spec send(Dest, Msg, Options) -> Res when Dest :: send_destination(), Msg :: term(), Options :: [nosuspend | noconnect], Res :: ok | nosuspend | noconnect.
傳送訊息並回傳 ok
,或不傳送訊息但回傳其他內容(請參閱下方)。否則與 erlang:send/2
相同。
如需更詳細的說明和警告,請參閱 erlang:send_nosuspend/2,3
。
選項
nosuspend
- 如果傳送者必須暫停才能執行傳送,則會改為傳回nosuspend
。noconnect
- 如果目的地節點必須自動連線才能執行傳送,則會改為傳回noconnect
。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
警告
如同
erlang:send_nosuspend/2,3
:請極其謹慎地使用。
-spec send_nosuspend(Dest, Msg) -> boolean() when Dest :: send_destination(), Msg :: term().
傳送訊息而不暫停呼叫者。
等同於 erlang:send(Dest, Msg, [nosuspend])
,但如果訊息已傳送,則傳回 true
,如果訊息因傳送者必須暫停而未傳送,則傳回 false
。
此函數旨在用於傳送到不可靠遠端節點的傳送操作,而不會阻塞傳送 (Erlang) 進程。如果到遠端節點 (通常不是真正的 Erlang 節點,而是用 C 或 Java 寫成的節點) 的連線過載,則此函數不會傳送訊息並傳回 false
。
如果 Dest
參照忙碌的本地埠,也會發生相同的情況。對於所有其他目的地 (允許使用一般傳送運算子 '!'
),此函數會傳送訊息並傳回 true
。
僅在極少數情況下才應使用此函數,即進程與 Erlang 節點通訊,而這些節點可能會在沒有任何跡象的情況下消失,導致 TCP 緩衝區和驅動程式佇列在節點被 net_kernel
關閉 (因為逾時) 之前就已過滿。發生這種情況時,通常的反應是對另一個節點進行某種形式的提前關閉。
請注意,忽略此函數的傳回值會導致訊息傳遞不可靠,這與 Erlang 程式設計模型相矛盾。如果此函數傳回 false
,則不會傳送訊息。
在許多系統中,佇列過載的暫時狀態是正常的。雖然此函數傳回 false
,並不表示保證另一個節點沒有回應,它可能只是暫時過載。此外,傳回值 true
僅表示訊息可以在 (TCP) 通道上傳送而不會阻塞;不保證訊息會送達遠端節點。對於已斷線的無回應節點,傳回值為 true
(模擬運算子 !
的行為)。當函數傳回 false
時,預期的行為和採取的動作是特定於應用程式和硬體的。
警告
請極其謹慎地使用。
-spec send_nosuspend(Dest, Msg, Options) -> boolean() when Dest :: send_destination(), Msg :: term(), Options :: [noconnect].
等同於 erlang:send(Dest, Msg, [nosuspend | Options])
,但具有布林回傳值。
此函數的行為類似於 erlang:send_nosuspend/2
,但會接受第三個參數,即選項清單。唯一的選項是 noconnect
,如果遠端節點目前無法被本地節點連線,則此選項會使函數傳回 false
。正常的行為是嘗試連線到節點,這可能會在短時間內使進程停頓。使用選項 noconnect
可以確保在傳送到遠端進程時不會有任何延遲。這在與期望始終為連線端的節點 (也就是說,用 C 或 Java 寫成的節點) 通訊時特別有用。
每當函數傳回 false
時 (無論是發生暫停時,還是指定了 noconnect
且節點尚未連線時),都保證訊息未傳送。
警告
請極其謹慎地使用。
回傳由將 Fun
應用於空列表 []
所啟動的新程序的程序識別符。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於 Node
上的空列表 []
所啟動的新程序的程序識別符。如果 Node
不存在,則會回傳無用的 pid。否則運作方式與 spawn/3
相同。
-spec spawn(Module, Function, Args) -> pid() when Module :: module(), Function :: atom(), Args :: [term()].
回傳由將 Module:Function
應用於 Args
所啟動的新程序的程序識別符。
如果 Module:Function/Arity
不存在 (其中 Arity
是 Args
的長度),則新進程會評估 error_handler:undefined_function(Module, Function, Args)
。可以重新定義錯誤處理程式 (請參閱 process_flag/2
)。如果 error_handler
未定義,或使用者已重新定義預設的 error_handler
且其替代未定義,則會發生原因為 undef
的失敗。
範例
> spawn(speed, regulator, [high_speed, thin_cut]).
<0.13.1>
-spec spawn(Node, Module, Function, Args) -> pid() when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()].
回傳由將 Module:Function
應用於 Node
上的 Args
所啟動的新程序的程序識別符 (pid)。如果 Node
不存在,則會回傳無用的 pid。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於空列表 []
所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3
相同。
回傳由將 Fun
應用於 Node
上的空列表 []
所啟動的新程序的程序識別符 (pid)。會在呼叫程序與新程序之間原子地建立連結。如果 Node
不存在,則會回傳無用的 pid,並向呼叫程序傳送帶有原因 noconnection
的退出信號。否則運作方式與 spawn/3
相同。
-spec spawn_link(Module, Function, Args) -> pid() when Module :: module(), Function :: atom(), Args :: [term()].
回傳由將 Module:Function
應用於 Args
所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3
相同。
-spec spawn_link(Node, Module, Function, Args) -> pid() when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()].
在 Node
節點上,將 Module:Function
應用於 Args
所啟動的新進程的進程識別碼 (pid)。呼叫進程與新進程之間會以原子方式建立連結。如果 Node
不存在,則會返回一個無用的 pid,並向呼叫進程發送帶有原因 noconnection
的退出信號。否則行為與 spawn/3
相同。
返回一個新進程的進程識別碼,該進程由將 Fun
應用於空列表 []
所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3
相同。
返回一個新進程的進程識別碼,該進程由在節點 Node
上將 Fun
應用於空列表 []
所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3
相同。
如果由 Node
識別的節點不支援分散式 spawn_monitor()
,則呼叫會失敗並產生 notsup
例外狀況。
-spec spawn_monitor(Module, Function, Args) -> {pid(), reference()} when Module :: module(), Function :: atom(), Args :: [term()].
透過將 Module:Function
應用於 Args
來啟動一個新進程。同時監控該進程。返回進程識別碼和監視器的參考。否則行為與 spawn/3
相同。
-spec spawn_monitor(Node, Module, Function, Args) -> {pid(), reference()} when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()].
透過將 Module:Function
應用於節點 Node
上的 Args
來啟動一個新進程。同時監控該進程。返回進程識別碼和監視器的參考。否則行為與 spawn/3
相同。
如果由 Node
識別的節點不支援分散式 spawn_monitor()
,則呼叫會失敗並產生 notsup
例外狀況。
-spec spawn_opt(Fun, Options) -> pid() | {pid(), reference()} when Fun :: function(), Options :: [spawn_opt_option()].
返回一個新進程的進程識別碼 (pid),該進程由將 Fun
應用於空列表 []
所啟動。否則行為與 spawn_opt/4
相同。
如果指定了 monitor
選項,新建立的程序會被監控,並且會返回 pid 和監控的參考值。
-spec spawn_opt(Node, Fun, Options) -> pid() | {pid(), reference()} when Node :: node(), Fun :: function(), Options :: [monitor | {monitor, [monitor_option()]} | link | OtherOption], OtherOption :: term().
返回一個新進程的進程識別碼 (pid),該進程由在 Node
上將 Fun
應用於空列表 []
所啟動。如果 Node
不存在,則會返回一個無用的 pid。否則行為與 spawn_opt/4
相同。
有效的選項取決於 Node
所識別的節點支援哪些選項。關於目前 OTP 版本在本機節點上的有效 Option
的說明,可以在 spawn_opt/4
的文件中找到。
-spec spawn_opt(Module, Function, Args, Options) -> Pid | {Pid, MonitorRef} when Module :: module(), Function :: atom(), Args :: [term()], Options :: [spawn_opt_option()], Pid :: pid(), MonitorRef :: reference().
行為與 spawn/3
相同,除了在建立進程時指定了一個額外的選項列表。
如果指定了 monitor
選項,新建立的程序會被監控,並且會返回 pid 和監控的參考值。
選項
link
- 設定與父進程的連結 (如同spawn_link/3
的作用)。monitor
- 監控新的程序 (如同monitor(process, Pid)
的作用)。將會返回一個{Pid, MonitorRef}
元組,而不是只有Pid
。{monitor, MonitorOpts}
- 使用選項監控新的程序 (如同monitor(process, Pid, MonitorOpts)
的作用)。將會返回一個{Pid, MonitorRef}
元組,而不是只有Pid
。{priority, Level}
- 設定新程序的優先級。等同於在新程序的啟動函數中執行process_flag(priority, Level)
,差別在於優先級會在程序第一次被選中執行之前就設定好。關於優先級的更多資訊,請參閱process_flag(priority, Level)
。{fullsweep_after, Number}
- 僅適用於效能調整。除非您知道執行時間或記憶體消耗有問題,並且確定此選項可以改善情況,否則請勿使用此選項。Erlang 運行時系統使用世代垃圾回收機制,對至少經歷過一次垃圾回收的數據使用「舊堆」。當舊堆沒有更多空間時,會執行完整的垃圾回收。
選項
fullsweep_after
可以指定在強制執行完整垃圾回收之前,世代回收的最大次數,即使舊堆仍有空間。將數字設定為零會停用一般回收演算法,也就是說,每次垃圾回收時都會複製所有存活的數據。以下是一些可能需要更改
fullsweep_after
的情況:- 如果不再使用的二進制數據需要盡快丟棄。(將
Number
設定為零。) - 主要處理短期數據的程序很少或永遠不會進行完整垃圾回收,也就是說,舊堆中主要包含垃圾。為了確保偶爾進行完整垃圾回收,請將
Number
設定為合適的值,例如 10 或 20。 - 在 RAM 容量有限且沒有虛擬記憶體的嵌入式系統中,您可能希望將
Number
設定為零來節省記憶體。(該值可以全域設定,請參閱erlang:system_flag/2
。)
- 如果不再使用的二進制數據需要盡快丟棄。(將
{min_heap_size, Size}
- 僅適用於效能調整。除非您知道執行時間或記憶體消耗有問題,並且確定此選項可以改善情況,否則請勿使用此選項。以字為單位給定最小堆大小。將此值設定高於系統預設值可以加速某些程序,因為垃圾回收次數會減少。但是,設定過高的值會浪費記憶體,並且由於資料局部性變差而減慢系統速度。因此,僅在微調應用程式時才使用此選項,並使用各種
Size
值來測量執行時間。{min_bin_vheap_size, VSize}
- 僅適用於效能調整。除非您知道執行時間或記憶體消耗有問題,並且確定此選項可以改善情況,否則請勿使用此選項。以字為單位給定最小二進制虛擬堆大小。將此值設定高於系統預設值可以加速某些程序,因為垃圾回收次數會減少。但是,設定過高的值會浪費記憶體。因此,僅在微調應用程式時才使用此選項,並使用各種
VSize
值來測量執行時間。{max_heap_size, Size}
- 設定max_heap_size
程序標誌。預設的max_heap_size
由+hmax
命令列參數在 erl 中決定。有關更多資訊,請參閱process_flag(max_heap_size, Size)
的文件。{message_queue_data, MQD}
- 設定message_queue_data
程序標誌的值。MQD
可以是off_heap
或on_heap
。message_queue_data
程序標誌的預設值由+hmqd
命令列參數在 erl 中決定。有關更多資訊,請參閱process_flag(message_queue_data, MQD)
的文件。{async_dist, Enabled}
- 自:OTP 25.3設定已產生程序的
async_dist
程序標誌。此選項將覆蓋由+pad <boolean>
命令列參數設定的預設值。
-spec spawn_opt(Node, Module, Function, Args, Options) -> pid() | {pid(), reference()} when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()], Options :: [monitor | {monitor, [monitor_option()]} | link | OtherOption], OtherOption :: term().
返回一個新進程的進程識別碼 (pid),該進程由在 Node
上將 Module:Function
應用於 Args
所啟動。如果 Node
不存在,則會返回一個無用的 pid。否則行為與 spawn_opt/4
相同。
有效的選項取決於 Node
所識別的節點支援哪些選項。關於目前 OTP 版本在本機節點上的有效 Option
的說明,可以在 spawn_opt/4
的文件中找到。
等同於呼叫 spawn_request(node(),Fun,[])
。也就是說,在本地節點上發出不帶任何選項的 spawn 請求。
-spec spawn_request(Fun, Options) -> ReqId when Fun :: function(), Option :: {reply_tag, ReplyTag} | {reply, Reply} | spawn_opt_option(), ReplyTag :: term(), Reply :: yes | no | error_only | success_only, Options :: [Option], ReqId :: reference(); (Node, Fun) -> ReqId when Node :: node(), Fun :: function(), ReqId :: reference().
等同於 spawn_request(node(),Fun,Options)
或 spawn_request(Node,Fun,[])
,具體取決於引數。
也就是
- 在本機節點上的產生請求。
- 不帶選項的產生請求。
-spec spawn_request(Node, Fun, Options) -> ReqId when Node :: node(), Fun :: function(), Options :: [Option], Option :: monitor | {monitor, [monitor_option()]} | link | {reply_tag, ReplyTag} | {reply, Reply} | OtherOption, ReplyTag :: term(), Reply :: yes | no | error_only | success_only, OtherOption :: term(), ReqId :: reference(); (Module, Function, Args) -> ReqId when Module :: module(), Function :: atom(), Args :: [term()], ReqId :: reference().
等同於 spawn_request(Node,erlang,apply,[Fun,[]],Options)
或 spawn_request(node(),Module,Function,Args,[])
,具體取決於引數。
也就是
- 使用零元函數
Fun
作為入口點的產生請求 - 在本機節點上不帶選項的產生請求。
如果出現以下情況,此函數將會產生 badarg
例外:
Node
不是原子。Fun
不是零元函數。Options
不是正確的詞彙列表。
spawn_request(NodeOrModule, ModuleOrFunction, FunctionOrArgs, ArgsOrOptions)
查看原始碼 (自動導入) (自 OTP 23.0 起)-spec spawn_request(Node, Module, Function, Args) -> ReqId when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()], ReqId :: reference(); (Module, Function, Args, Options) -> ReqId when Module :: module(), Function :: atom(), Args :: [term()], Option :: {reply_tag, ReplyTag} | {reply, Reply} | spawn_opt_option(), ReplyTag :: term(), Reply :: yes | no | error_only | success_only, Options :: [Option], ReqId :: reference().
等同於 spawn_request(Node,Module,Function,Args,[])
或 spawn_request(node(),Module,Function,Args,Options)
,具體取決於引數。
也就是
- 不帶選項的產生請求。
- 在本機節點上的產生請求。
-spec spawn_request(Node, Module, Function, Args, Options) -> ReqId when Node :: node(), Module :: module(), Function :: atom(), Args :: [term()], Options :: [Option], Option :: monitor | {monitor, [monitor_option()]} | link | {reply_tag, ReplyTag} | {reply, Reply} | OtherOption, ReplyTag :: term(), Reply :: yes | no | error_only | success_only, OtherOption :: term(), ReqId :: reference().
非同步傳送 spawn 請求。返回請求識別碼 ReqId
。
如果產生操作成功,則會在 Node
所識別的節點上建立新程序。當產生操作成功時,預設情況下,呼叫方會收到一個格式為 {ReplyTag, ReqId, ok, Pid}
的訊息,其中 Pid
是新建立程序的程序標識符。此類訊息在本文中稱為成功訊息。ReplyTag
預設為原子 spawn_reply
,除非被 {reply_tag, ReplyTag}
選項修改。新程序通過將 Module:Function
應用於 Args
來啟動。
如果新程序建立失敗或產生操作被連線失敗中斷,則產生操作會失敗。當產生操作失敗時,呼叫方預設會收到一個格式為 {ReplyTag, ReqId, error, Reason}
的訊息,其中 Reason
是錯誤原因。此類訊息在本文中稱為錯誤訊息。目前定義了以下產生錯誤 Reason
,但其他原因可能會隨時出現,恕不另行通知:
badopt
- 傳遞了無效的Option
作為參數。請注意,不同的運行時系統可能支援不同的選項。notsup
- 由Node
所識別的節點不支援由spawn_request()
發出的產生操作。noconnection
- 無法建立與由Node
所識別的節點的連線,或在產生操作期間遺失了與該節點的連線。如果連線遺失,則可能已建立或未建立程序。system_limit
- 因為達到某些系統限制而無法建立新程序。通常是程序表已滿。
有效的 Option
:
monitor
- 在沒有產生操作失敗的情況下,原子性地設定對新建立程序的監控。也就是說,如同呼叫程序已呼叫monitor(process, Pid)
,其中Pid
是新建立程序的程序標識符。spawn_request()
返回的ReqId
也會被用作監控參考,如同從monitor(process, Pid)
返回的一樣。在產生操作成功之前,監控不會對呼叫程序啟用。在操作成功之前,無法 取消監控。在與產生操作對應的 成功訊息 之前,保證不會傳遞相應監控的
'DOWN'
訊息。如果產生操作失敗,則不會傳遞'DOWN'
訊息。如果在產生操作期間,涉及產生操作的節點之間的連線遺失,則產生操作將會失敗,錯誤原因為
noconnection
。可能已建立或未建立新程序。{monitor, MonitorOpts}
- 在沒有產生操作失敗的情況下,原子性地設定對新建立程序的監控。也就是說,如同呼叫程序已呼叫monitor(process, Pid, MonitorOpts)
,其中Pid
是新建立程序的程序標識符。請參閱上面的monitor
選項以獲取更多資訊。請注意,在產生操作成功之前,監控不會對呼叫程序啟用。例如,如果使用監控選項建立別名,則在監控啟用之前,該別名將不會處於活動狀態。
link
- 在沒有產生操作失敗的情況下,原子性地設定呼叫程序和新建立程序之間的連結。也就是說,如同呼叫程序已呼叫link(Pid)
,其中Pid
是新建立程序的程序標識符。在衍生 (spawn) 操作成功之前,連結不會對呼叫程序啟用。在操作成功之前,連結無法被移除。保證在與衍生操作相對應的成功訊息 之前,不會因為連結而傳遞退出訊號。如果衍生操作失敗,則不會因為連結而將退出訊號傳遞給
spawn_request()
的呼叫者。如果在衍生操作期間,參與衍生操作的節點之間的連線遺失,則衍生操作將會失敗,錯誤原因是
noconnection
。可能已建立或可能尚未建立新程序。如果已建立,將會向其傳遞退出訊號,退出原因為noconnection
。{reply, Reply}
- 有效的Reply
值{reply_tag, ReplyTag}
- 在回覆訊息中將回覆標籤設定為ReplyTag
。也就是說,在由於衍生操作而傳送給呼叫者的成功或錯誤訊息中。預設的回覆標籤是原子spawn_reply
。OtherOption
- 其他有效選項取決於由Node
所識別的節點所支援的選項。有關目前 OTP 版本之本機節點的其他有效Option
描述,可以在spawn_opt/4
的文件中找到。
如果傳遞了衍生回覆訊息,則保證會在將任何來自新衍生程序的其他訊號傳遞至發出衍生請求的程序之前傳遞。
如果出現以下情況,此函數將會產生 badarg
例外:
Node
不是原子。Module
不是原子。Function
不是原子。Args
不是正確的項列表。Options
不是正確的詞彙列表。
請注意,當傳送衍生請求時,並非檢查所有個別的 Option
。某些 Option
只能在收到請求時進行檢查。因此,無效的選項*不會*導致 badarg
例外,而是會導致衍生操作失敗,錯誤原因是 badopt
。
可以透過呼叫 spawn_request_abandon/1
來放棄衍生請求。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
放棄先前發出的 spawn 請求。ReqId
對應於先前由目前進程呼叫 spawn_request()
所返回的請求識別碼。也就是說,只有發出請求的進程才能放棄該請求。
只有在衍生請求完成之前,才能成功放棄衍生請求。當衍生請求成功放棄後,呼叫者將不會受到衍生請求本身未來直接影響。例如,它不會收到衍生回覆訊息。但是,該請求並未撤回,因此可能會或可能不會由於該請求而建立新程序。如果在放棄衍生請求後建立了新程序,則不會因為衍生請求而為 spawn_request_abandon/1
的呼叫者設定任何監視器或連結。如果衍生請求包含 link
選項,則會從其父程序向由於此請求而建立的程序傳送退出訊號,退出原因為 abandoned
,當偵測到衍生操作成功時。
注意
由於已放棄的衍生請求而建立的程序可以像任何其他程序一樣與其父程序進行通訊。*只有*實際衍生請求對父程序的直接影響,才會透過放棄衍生請求而被取消。
傳回值
true
- 衍生請求已成功放棄。false
- 沒有放棄衍生請求。ReqId
請求識別碼不對應於呼叫程序發出的未完成衍生請求。原因可能是ReqId
對應於呼叫程序先前發出的衍生請求。衍生操作已完成,並且已將衍生回覆傳遞給呼叫程序,除非在請求中停用了衍生回覆。ReqId
不對應於呼叫程序發出的衍生請求。
如果 ReqId
不是參考,則此函數會失敗,並發生 badarg
例外。
-spec suspend_process(Suspendee) -> true when Suspendee :: pid().
暫停由 Suspendee
識別的進程。等同於呼叫 erlang:suspend_process(Suspendee, [])
。
警告
此 BIF 僅用於除錯目的。
-spec suspend_process(Suspendee, OptList) -> boolean() when Suspendee :: pid(), OptList :: [Opt], Opt :: unless_suspending | asynchronous | {asynchronous, term()}.
增加由 Suspendee
識別的進程的暫停計數,如果該進程尚未處於暫停狀態,則將其置於暫停狀態。在進程恢復之前,暫停的進程不會被排程執行。
一個程序可以被多個程序暫停,並且可以被單個程序暫停多次。暫停的程序只有在其暫停計數達到零時才會離開暫停狀態。當呼叫 erlang:suspend_process(Suspendee)
的同一個程序呼叫 erlang:resume_process(Suspendee)
時,Suspendee
的暫停計數會減少。當程序終止時,由程序取得的其他程序上的所有增加的暫停計數都會自動減少。
選項 (Opt
s)
asynchronous
- 將暫停請求傳送至Suspendee
所識別的程序。Suspendee
最終會暫停,除非它在可以暫停之前被恢復。無論Suspendee
是否已暫停,erlang:suspend_process/2
的呼叫者都會立即返回。無法從系統中的其他事件推斷出Suspendee
暫停的時間點。只能保證Suspendee
*最終*會暫停(除非它被恢復)。如果沒有傳遞asynchronous
選項,則erlang:suspend_process/2
的呼叫者會被封鎖,直到Suspendee
暫停為止。{asynchronous, ReplyTag}
- 將暫停請求傳送至Suspendee
所識別的程序。當暫停請求被處理後,會向此函數的呼叫者傳送回覆訊息。回覆的形式為{ReplyTag, State}
,其中State
為exited
-Suspendee
已退出。suspended
-Suspendee
現在已暫停。not_suspended
-Suspendee
未暫停。只有在發出此請求的程序在取得回覆之前呼叫resume_process(Suspendee)
時才會發生這種情況。
除了回覆訊息之外,
{asynchronous, ReplyTag}
選項的行為與沒有回覆標籤的asynchronous
選項完全相同。unless_suspending
- 除非呼叫程序已經在暫停Suspendee
,否則會暫停Suspendee
所識別的程序。如果unless_suspending
與選項asynchronous
結合使用,則除非呼叫程序已在暫停Suspendee
,或者已傳送暫停請求且正在傳輸中,否則會傳送暫停請求。如果呼叫程序已在暫停Suspendee
,或者如果與選項asynchronous
結合使用且已傳送請求正在傳輸中,則會傳回false
,且Suspendee
的暫停計數保持不變。
如果 Suspendee
所識別的程序的暫停計數增加,則會傳回 true
,否則會傳回 false
。
警告
此 BIF 僅用於除錯目的。
警告
如果程序互相暫停(直接或循環),則很容易建立死鎖。在 ERTS 10.0 版之前的 ERTS 版本中,執行時間系統會阻止此類死鎖,但由於效能原因,現在已移除此預防措施。
失敗
badarg
- 如果Suspendee
不是進程識別符。badarg
- 如果Suspendee
所識別的程序與呼叫erlang:suspend_process/2
的程序相同。badarg
- 如果由Suspendee
識別的進程未處於執行狀態。badarg
- 如果Suspendee
所識別的程序位於另一個節點上。badarg
- 如果OptList
不是有效Opt
的正確列表。system_limit
- 如果呼叫程序暫停Suspendee
的次數,超過了目前使用的內部資料結構可以表示的次數。系統限制大於 2,000,000,000 次暫停,且永遠不會更低。
引發 throw
類別的例外狀況。旨在用於從函數執行非本地返回。
如果在 catch 運算式 中評估,則 catch 運算式會傳回值 Any
。
例如
> catch throw({hello, there}).
{hello,there}
如果在 try 運算式的 try
區塊中評估,則可以在 catch 區塊中捕捉到值 Any
。
例如
try
throw({my_exception, "Something happened"})
catch
throw:{my_exception, Desc} ->
io:format(standard_error, "Error: ~s~n", [Desc])
end
失敗:如果未被例外處理常式捕捉,則為 nocatch
。
有關更多資訊,請參閱有關錯誤和錯誤處理的指南。
停用呼叫進程先前建立的別名 Alias
。
別名可以透過例如 alias/0
或 monitor/3
建立。unalias/1
將始終停用別名,而無論建立別名時使用的選項為何。
如果 Alias
是目前程序的作用中別名,則傳回 true;否則傳回 false。
有關程序別名的更多資訊,請參閱《Erlang 參考手冊》中 程序別名 章節。
移除呼叫進程與另一個進程或由 Id
識別的埠之間的連結。
從此以後,我們將呼叫所識別的程序或埠為取消連結者。
可以使用 link/1
BIF 建立連結。有關連結和由於連結而發出的退出訊號的詳細資訊,請參閱《Erlang 參考手冊》中的「程序」章節
一旦 unlink(Id)
返回後,保證呼叫者和取消連結者之間的連結在未來不會對呼叫者產生影響(除非重新設定連結)。請注意,如果呼叫者正在捕捉退出,則在 unlink(Id)
呼叫完成之前,可能已將由於連結而產生的 {'EXIT', Id, ExitReason}
訊息放入呼叫者的訊息佇列中。另請注意,{'EXIT', Id, ExitReason}
訊息可能是連結的結果,但也可能是由於取消連結者透過呼叫 exit/2
BIF 向呼叫者傳送退出訊號而產生的。因此,當捕捉退出時,在呼叫 unlink(Id)
之後清理訊息佇列可能適當或不適當,如下所示
unlink(Id),
receive
{'EXIT', Id, _} ->
true
after 0 ->
true
end
連結移除操作是非同步執行的。如果該連結不存在,則不會執行任何動作。關於連結協定的詳細描述,請參閱《ERTS 使用者指南》中的「分散式協定」章節。
注意
有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。
失敗:如果 Id
沒有識別出一個程序或本地節點埠,則返回 badarg
。
-spec unregister(RegName) -> true when RegName :: atom().
從名稱註冊表
中移除與進程識別碼或埠識別碼相關聯的已註冊名稱
RegName
。
例如
> unregister(db).
true
請記住,即使在註銷已註冊的名稱後,您仍然可以收到與該名稱相關的訊號,因為發送者可能在發送訊號前已經查找過該名稱。
建議使用者不要註銷系統程序。
失敗:如果 RegName
不是已註冊的名稱,則返回 badarg
。
從 名稱註冊表
返回具有 已註冊名稱
RegName
的進程識別碼或埠識別碼。如果該名稱未註冊,則返回 undefined
。
例如
> whereis(db).
<0.43.0>
-spec yield() -> true.
嘗試讓具有相同或更高優先順序的其他進程 (如果有的話) 在返回之前有機會執行。無法保證在呼叫和返回 erlang:yield/0
之間會執行任何其他進程。
請參閱 receive-after
運算式的文件,了解如何讓當前程序休眠特定的毫秒數。
警告
很少或幾乎不需要使用這個 BIF。若不完全了解排程器的工作原理,使用此 BIF 可能會導致效能下降。此函數的目前實作會將當前程序放在當前排程器中與當前程序具有相同優先級的程序的隊列的最後面。
系統
-spec halt() -> no_return().
等同於呼叫 halt(0, [])
。
例如
> halt().
os_prompt%
-spec halt(Status :: non_neg_integer()) -> no_return(); (Abort :: abort) -> no_return(); (CrashDumpSlogan :: string()) -> no_return().
等同於呼叫 halt(HaltType, [])
。
例如
> halt(17).
os_prompt% echo $?
17
os_prompt%
-spec halt(Status :: non_neg_integer(), Options :: halt_options()) -> no_return(); (Abort :: abort, Options :: halt_options()) -> no_return(); (CrashDumpSlogan :: string(), Options :: halt_options()) -> no_return().
停止執行階段系統。
halt(Status :: non_neg_integer(), Options :: halt_options())
使用狀態碼
Status
停止執行階段系統。注意
在許多平台上,作業系統僅支援狀態碼 0-255。過大的狀態碼會被截斷,清除高位元。
目前有效的選項如下:
{flush, EnableFlushing}
- 如果EnableFlushing
等於true
,這也是預設行為,執行階段系統會在終止之前執行以下操作:- 刷新所有未完成的輸出。
- 發送所有 Erlang 埠的結束訊號,並等待它們結束。
- 等待所有非同步線程完成所有未完成的非同步任務。
- 呼叫所有已安裝的 NIF on halt 回呼函數。
- 等待所有正在進行的,並啟用 delay halt 設定的 NIF 呼叫 返回。
- 呼叫所有已安裝的
atexit
/on_exit
回呼函數。
如果
EnableFlushing
等於false
,執行階段系統將立即終止,而不會執行以上列出的任何操作。變更
在 OTP 26.0 之前的執行階段系統中,即使禁用
flush
,也會呼叫所有已安裝的atexit
/on_exit
回呼函數,但從 OTP 26.0 開始,情況不再如此。{flush_timeout, Timeout :: 0..2147483647 | infinity}
- 設定在執行階段系統終止之前,允許 刷新 的時間限制。Timeout
以毫秒為單位。預設值由erl
的+zhft <Timeout>
命令列標誌決定。如果刷新已持續
Timeout
毫秒,刷新操作將被中斷,並且執行階段系統將立即終止,退出碼為255
。如果未啟用刷新,超時將對系統沒有影響。另請參閱
erl
的+zhft <Timeout>
命令列標誌。請注意,命令列標誌和flush_timeout
選項設定的最短超時時間將是實際生效的超時值。自:OTP 27.0 起
halt(Abort :: abort, Options :: halt_options())
透過中止執行階段系統並產生核心轉儲來停止 Erlang 執行階段系統,前提是已在執行階段系統執行的環境中啟用核心轉儲。
注意
{flush, boolean()}
選項將被忽略,並且將禁用刷新。halt(CrashDumpSlogan :: string(), Options :: halt_options())
停止 Erlang 執行階段系統並產生 Erlang 崩潰轉儲。字串
CrashDumpSlogan
將用作所建立的 Erlang 崩潰轉儲中的標語。如果CrashDumpSlogan
長度超過 1023 個字元,則該標語將被截斷。注意
{flush, boolean()}
選項將被忽略,並且將禁用刷新。變更
與早期版本相比的行為變更:
- 在 OTP 24.2 之前,如果
CrashDumpSlogan
長度超過 200 個字元,則標語會被截斷。現在,如果長度超過 1023 個字元,則會被截斷。 - 在 OTP 20.1 之前,標語中僅接受 0-255 範圍內的程式碼點。現在,任何 Unicode 字串都是有效的。
- 在 OTP 24.2 之前,如果
-spec memory() -> [{Type, Size}] when Type :: memory_type(), Size :: non_neg_integer().
返回一個列表,其中包含有關 Erlang 模擬器動態配置的記憶體資訊。
每個列表元素都是一個元組 {Type, Size}
。第一個元素 Type
是一個原子,描述記憶體類型。第二個元素 Size
是以位元組為單位的記憶體大小。
記憶體類型:
total
- 目前已分配的記憶體總量。這與processes
和system
的記憶體大小總和相同。processes
- 目前為 Erlang 程序分配的記憶體總量。processes_used
- 目前由 Erlang 程序使用的記憶體總量。這是作為processes
記憶體呈現的一部分。system
- 目前為模擬器分配的,但不直接與任何 Erlang 程序相關的記憶體總量。作為processes
呈現的記憶體不包含在此記憶體中。instrument
可用於取得屬於此類型的記憶體的更詳細細分。atom
- 目前為原子分配的記憶體總量。此記憶體是作為system
記憶體呈現的一部分。atom_used
- 目前用於原子的記憶體總量。此記憶體是作為atom
記憶體呈現的一部分。binary
- 目前為二進制檔案分配的記憶體總量。此記憶體是作為system
記憶體呈現的一部分。code
- 目前為 Erlang 程式碼分配的記憶體總量。此記憶體是作為system
記憶體呈現的一部分。ets
- 目前為 ETS 表格分配的記憶體總量。此記憶體是作為system
記憶體呈現的一部分。maximum
- 自模擬器啟動以來分配的最大記憶體總量。此元組僅在模擬器以儀器化模式執行時存在。有關如何以儀器化模式執行模擬器的資訊,請參閱
instrument
和/或erl(1)
。
注意
system
值不完整。某些要屬於此值的已分配記憶體不是。當模擬器以儀器化模式執行時,
system
值更準確,但直接為malloc
(和相關函數)分配的記憶體仍然不屬於system
值。僅從作業系統特定的執行階段函式庫以及可能從不使用驅動程式介面中的記憶體配置函數的使用者實作的 Erlang 驅動程式進行直接呼叫malloc
。由於
total
值是processes
和system
的總和,因此system
中的錯誤會傳播到total
值。不同記憶體量的總和不是以原子方式收集的,這會在結果中引入錯誤。
不同的值之間具有以下關係。以大寫字母開頭的值不是結果的一部分。
total = processes + system
processes = processes_used + ProcessesNotUsed
system = atom + binary + code + ets + OtherSystem
atom = atom_used + AtomNotUsed
RealTotal = processes + RealSystem
RealSystem = system + MissedSystem
在未來的版本中,可以在傳回的清單中新增更多元組。
注意
total
值應該是模擬器動態分配的總記憶體量。共享函式庫、模擬器本身的程式碼和模擬器堆疊不應該包含在內。也就是說,total
值不應該等於對應到模擬器的所有頁面的總大小。此外,由於記憶體區域的碎片和預先保留,包含動態分配的記憶體區塊的記憶體段的大小可能遠大於動態分配的記憶體區塊的總大小。
變更
從 ERTS 5.6.4 開始,
erlang:memory/0
要求啟用所有erts_alloc(3)
配置器(預設行為)。
失敗:如果已禁用 erts_alloc(3)
配置器,則返回 notsup
。
-spec memory(Type :: memory_type()) -> non_neg_integer(); (TypeList :: [memory_type()]) -> [{memory_type(), non_neg_integer()}].
返回為 Type
類型的記憶體配置的記憶體大小 (以位元組為單位)。引數也可以指定為 memory_type/0
原子列表,在這種情況下,會返回對應的 {memory_type(), Size :: integer >= 0}
元組列表。
變更
從 ERTS 5.6.4 開始,
erlang:memory/1
要求啟用所有erts_alloc(3)
配置器(預設行為)。
失敗
badarg
- 如果Type
不是erlang:memory/0
的說明中列出的記憶體類型之一。badarg
- 如果將maximum
作為Type
傳遞,且模擬器未在儀器化模式下執行。notsup
- 如果已禁用erts_alloc(3)
配置器。
另請參閱 erlang:memory/0
。
-spec statistics(active_tasks) -> [ActiveTasks] when ActiveTasks :: non_neg_integer(); (active_tasks_all) -> [ActiveTasks] when ActiveTasks :: non_neg_integer(); (context_switches) -> {ContextSwitches, 0} when ContextSwitches :: non_neg_integer(); (exact_reductions) -> {Total_Exact_Reductions, Exact_Reductions_Since_Last_Call} when Total_Exact_Reductions :: non_neg_integer(), Exact_Reductions_Since_Last_Call :: non_neg_integer(); (garbage_collection) -> {Number_of_GCs, Words_Reclaimed, 0} when Number_of_GCs :: non_neg_integer(), Words_Reclaimed :: non_neg_integer(); (io) -> {{input, Input}, {output, Output}} when Input :: non_neg_integer(), Output :: non_neg_integer(); (microstate_accounting) -> [MSAcc_Thread] | undefined when MSAcc_Thread :: #{type := MSAcc_Thread_Type, id := MSAcc_Thread_Id, counters := MSAcc_Counters}, MSAcc_Thread_Type :: async | aux | dirty_io_scheduler | dirty_cpu_scheduler | poll | scheduler, MSAcc_Thread_Id :: non_neg_integer(), MSAcc_Counters :: #{MSAcc_Thread_State => non_neg_integer()}, MSAcc_Thread_State :: alloc | aux | bif | busy_wait | check_io | emulator | ets | gc | gc_fullsweep | nif | other | port | send | sleep | timers; (reductions) -> {Total_Reductions, Reductions_Since_Last_Call} when Total_Reductions :: non_neg_integer(), Reductions_Since_Last_Call :: non_neg_integer(); (run_queue) -> non_neg_integer(); (run_queue_lengths) -> [RunQueueLength] when RunQueueLength :: non_neg_integer(); (run_queue_lengths_all) -> [RunQueueLength] when RunQueueLength :: non_neg_integer(); (runtime) -> {Total_Run_Time, Time_Since_Last_Call} when Total_Run_Time :: non_neg_integer(), Time_Since_Last_Call :: non_neg_integer(); (scheduler_wall_time) -> [{SchedulerId, ActiveTime, TotalTime}] | undefined when SchedulerId :: pos_integer(), ActiveTime :: non_neg_integer(), TotalTime :: non_neg_integer(); (scheduler_wall_time_all) -> [{SchedulerId, ActiveTime, TotalTime}] | undefined when SchedulerId :: pos_integer(), ActiveTime :: non_neg_integer(), TotalTime :: non_neg_integer(); (total_active_tasks) -> ActiveTasks when ActiveTasks :: non_neg_integer(); (total_active_tasks_all) -> ActiveTasks when ActiveTasks :: non_neg_integer(); (total_run_queue_lengths) -> TotalRunQueueLengths when TotalRunQueueLengths :: non_neg_integer(); (total_run_queue_lengths_all) -> TotalRunQueueLengths when TotalRunQueueLengths :: non_neg_integer(); (wall_clock) -> {Total_Wallclock_Time, Wallclock_Time_Since_Last_Call} when Total_Wallclock_Time :: non_neg_integer(), Wallclock_Time_Since_Last_Call :: non_neg_integer().
返回有關目前系統的統計資料。
可能的標誌如下:
statistics(active_tasks) -> [non_neg_integer()]
傳回與
statistics(active_tasks_all)
相同的結果,但結果中不包含關於髒 IO 執行佇列及其相關排程器的資訊。也就是說,結果中只包含預期會受 CPU 限制的任務。自 OTP 18.3 版本起可用
statistics(active_tasks_all) -> [non_neg_integer()]
傳回一個列表,其中每個元素代表每個執行佇列及其相關排程器上活動的進程和端口數量。也就是說,準備執行或目前正在執行的進程和端口數量。一般執行佇列及其相關排程器的數值會先出現在結果列表中。第一個元素對應於排程器編號 1,依此類推。如果支援髒排程器,則會接著出現髒 CPU 執行佇列及其相關髒 CPU 排程器的數值,最後一個元素則會是髒 IO 執行佇列及其相關髒 IO 排程器的數值。這些資訊並非以原子方式收集。也就是說,結果不一定是狀態的一致快照,而是以相當有效率的方式收集。
注意
每個一般排程器都管理一個執行佇列。如果支援髒排程器,則所有髒 CPU 排程器會共用一個執行佇列,而所有髒 IO 排程器也會共用一個執行佇列。也就是說,我們有多個一般執行佇列、一個髒 CPU 執行佇列和一個髒 IO 執行佇列。工作無法在不同類型的執行佇列之間遷移。只有一般執行佇列中的工作可以遷移到其他一般執行佇列。在評估結果時必須考慮到這一點。
另請參閱
statistics(total_active_tasks)
、statistics(run_queue_lengths)
、statistics(run_queue_lengths_all)
、statistics(total_run_queue_lengths)
和statistics(total_run_queue_lengths_all)
。自 OTP 20.0 版本起可用
statistics(context_switches) -> {non_neg_integer(), 0}
傳回自系統啟動以來發生的上下文切換總數。
statistics(exact_reductions) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}
傳回精確歸約的次數。
注意
statistics(exact_reductions)
是一個比 statistics(reductions) 更耗費資源的操作。statistics(garbage_collection) -> { NumerOfGCs :: non_neg_integer(), WordsReclaimed :: non_neg_integer(), 0}
傳回關於垃圾回收的資訊,例如
> statistics(garbage_collection). {85,23961,0}
此資訊可能對某些實作無效。
statistics(io) -> {{input, non_neg_integer()}, {output, non_neg_integer()}}
傳回
Input
,即透過端口接收的總位元組數,以及Output
,即輸出到端口的總位元組數。statistics(microstate_accounting) -> [MSAcc_Thread]
微狀態計數可用於測量 Erlang 執行時系統花費在執行各種任務上的時間。它的設計宗旨是盡可能輕量,但啟用時仍會產生一些額外負荷。微狀態計數旨在成為一個效能分析工具,以協助找出效能瓶頸。若要
start
/stop
/reset
微狀態計數,請使用系統標誌microstate_accounting
。statistics(microstate_accounting)
會傳回一個映射列表,代表 ERTS 中的部分 OS 線程。每個映射都包含type
和id
欄位,可用於識別是哪個線程,以及一個計數器欄位,其中包含關於在各種狀態下花費多少時間的資料。範例
> erlang:statistics(microstate_accounting). [#{counters => #{aux => 1899182914, check_io => 2605863602, emulator => 45731880463, gc => 1512206910, other => 5421338456, port => 221631, sleep => 5150294100}, id => 1, type => scheduler}|...]
時間單位與
os:perf_counter/0
傳回的時間單位相同。因此,若要將其轉換為毫秒,您可以執行如下的操作lists:map( fun(#{ counters := Cnt } = M) -> MsCnt = maps:map(fun(_K, PerfCount) -> erlang:convert_time_unit(PerfCount, perf_counter, 1000) end, Cnt), M#{ counters := MsCnt } end, erlang:statistics(microstate_accounting)).
請注意,這些值並不能保證是每個狀態所花費的精確時間。這是因為為了盡可能減少額外負荷而進行的各種最佳化所導致的。
MSAcc_Thread_Type
sscheduler
- 主要的執行線程,執行大部分的工作。如需詳細資訊,請參閱 erl +S。dirty_cpu_scheduler
- 用於執行長時間 CPU 密集型工作的線程。如需詳細資訊,請參閱 erl +SDcpu。dirty_io_scheduler
- 用於執行長時間 I/O 工作的線程。如需詳細資訊,請參閱 erl +SDio。async
- 各種連結驅動程式(主要是檔案驅動程式)使用非同步線程來卸載非 CPU 密集型工作。如需詳細資訊,請參閱 erl +A。aux
- 處理未明確分配給排程器的任何工作。poll
- 為模擬器執行 IO 輪詢。如需詳細資訊,請參閱 erl +IOt。
可用的
MSAcc_Thread_State
如下所示。所有狀態都是互斥的,這表示一個線程不能同時處於兩種狀態。因此,如果您將線程中所有計數器的數值加總,就會得到該線程的總執行時間。aux
- 花費在處理輔助工作的時間。check_io
- 花費在檢查新 I/O 事件的時間。emulator
- 花費在執行 Erlang 進程的時間。gc
- 花費在執行垃圾回收的時間。啟用額外狀態時,這是花費在執行非完整掃描垃圾回收的時間。other
- 花費在執行未計入事項的時間。port
- 花費在執行端口的時間。sleep
- 花費在睡眠的時間。
可以透過組態新增更精細的
MSAcc_Thread_State
(例如./configure --with-microstate-accounting=extra
)。啟用這些狀態會在關閉微狀態計數時導致效能降低,並在開啟時增加額外負荷。alloc
- 花費在管理記憶體的時間。如果沒有額外狀態,則此時間會分散在所有其他狀態中。bif
- 花費在 BIF 中的時間。如果沒有額外狀態,則此時間是emulator
狀態的一部分。busy_wait
- 花費在忙碌等待的時間。當使用statistics(scheduler_wall_time)
時,排程器不再報告為處於活動狀態時,也處於此狀態。因此,如果您將所有其他狀態(但不包括此狀態和睡眠)加總,然後除以該線程中的所有時間,您應該會得到與scheduler_wall_time
分數非常相似的值。如果沒有額外狀態,則此時間是other
狀態的一部分。ets
- 花費在執行 ETS BIF 的時間。如果沒有額外狀態,則此時間是emulator
狀態的一部分。gc_full
- 花費在執行完整掃描垃圾回收的時間。如果沒有額外狀態,則此時間是gc
狀態的一部分。nif
- 花費在 NIF 中的時間。如果沒有額外狀態,則此時間是emulator
狀態的一部分。send
- 花費在傳送訊息的時間 (僅限進程)。如果沒有額外狀態,則此時間是emulator
狀態的一部分。timers
- 花費在管理計時器的時間。如果沒有額外狀態,則此時間是other
狀態的一部分。
公用程式模組
msacc
可用於更輕鬆地分析這些統計資料。如果關閉系統標誌
microstate_accounting
,則傳回undefined
。線程資訊列表未排序,並且在不同呼叫之間可能以不同的順序出現。
注意
線程和狀態可能會在沒有任何事先通知的情況下變更。
自 OTP 19.0 版本起可用
statistics(reductions) -> {Reductions :: non_neg_integer(), SinceLastCall :: non_neg_integer()}
傳回關於歸約的資訊,例如
> statistics(reductions). {2046,11}
變更
從 ERTS 5.5 (Erlang/OTP R11B) 開始,此值不包含目前排程進程在目前時間片段中執行的歸約。如果需要精確的值,請使用
statistics(exact_reductions)
。statistics(run_queue) -> non_neg_integer()
傳回所有一般和髒 CPU 執行佇列的總長度。也就是說,預期會受 CPU 限制的佇列工作。這些資訊是以原子方式收集。也就是說,結果是狀態的一致快照,但與
statistics(total_run_queue_lengths)
相比,此操作的成本要高得多,尤其是在使用大量排程器時。statistics(run_queue_lengths) -> [non_neg_integer()]
傳回與
statistics(run_queue_lengths_all)
相同的結果,但結果中不包含關於髒 IO 執行佇列的資訊。也就是說,結果中只包含預期會受 CPU 限制的工作的執行佇列。自 OTP 18.3 版本起可用
statistics(run_queue_lengths_all) -> [non_neg_integer()]
傳回一個列表,其中每個元素代表每個執行佇列準備執行的進程和端口數量。一般執行佇列的數值會先出現在結果列表中。第一個元素對應於排程器編號 1 的一般執行佇列,依此類推。如果支援髒排程器,則髒 CPU 執行佇列和髒 IO 執行佇列的數值會依序出現在末尾。這些資訊並非以原子方式收集。也就是說,結果不一定是狀態的一致快照,而是以相當有效率的方式收集。
注意
每個一般排程器都管理一個執行佇列。如果支援髒排程器,則所有髒 CPU 排程器會共用一個執行佇列,而所有髒 IO 排程器也會共用一個執行佇列。也就是說,我們有多個一般執行佇列、一個髒 CPU 執行佇列和一個髒 IO 執行佇列。工作無法在不同類型的執行佇列之間遷移。只有一般執行佇列中的工作可以遷移到其他一般執行佇列。在評估結果時必須考慮到這一點。
另請參閱
statistics(run_queue_lengths)
、statistics(total_run_queue_lengths_all)
、statistics(total_run_queue_lengths)
、statistics(active_tasks)
、statistics(active_tasks_all)
、statistics(total_active_tasks)
和statistics(total_active_tasks_all)
。自 OTP 20.0 版本起可用
statistics(runtime) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}
傳回關於執行時間的資訊,單位為毫秒。
這是 Erlang 執行時系統中所有線程的執行時間總和,因此可能會大於掛鐘時間。
警告
此值可能會因為所使用的作業系統提供的底層功能限制而環繞。
範例
> statistics(runtime). {1690,1620}
statistics(scheduler_wall_time) -> [{Id :: pos_integer, ActiveTime :: non_neg_integer(), TotalTime :: non_neg_integer()}] | undefined
傳回描述系統中一般和髒 CPU 排程器忙碌時間的資訊。此值通常是 Erlang 節點負載程度的更好指標,而不是查看
top
或sysstat
等工具提供的 CPU 使用率。這是因為scheduler_wall_time
也包括排程器等待其他資源(例如內部互斥鎖)可用的時間,但不使用 CPU。為了更好地了解排程器在忙碌時正在做什麼,您可以使用微狀態計數。忙碌排程器的定義是指它沒有閒置,也沒有忙碌等待新工作,也就是
- 執行進程程式碼
- 執行連結驅動程式或 NIF 程式碼
- 執行 BIF 或任何其他執行時處理
- 執行垃圾回收
- 處理任何其他記憶體管理
請注意,即使作業系統已排程排除排程器線程,排程器也可能處於忙碌狀態。
注意
建議使用模組
scheduler
而不是直接使用此函式,因為它提供了一種更輕鬆的方式來獲取您通常想要的資訊。如果已啟用,此函式會傳回一個元組列表,其中包含
{SchedulerId, ActiveTime, TotalTime}
,其中SchedulerId
是排程器的整數 ID,ActiveTime
是排程器忙碌的持續時間,而TotalTime
是自scheduler_wall_time
啟用以來特定排程器的總時間持續時間。傳回的時間單位未定義,並且可能會在發行版本、作業系統和系統重新啟動之間變更。scheduler_wall_time
只能用於計算排程器利用率的相對值。ActiveTime
永遠不能超過TotalTime
。排程器資訊列表未排序,並且在不同呼叫之間可能以不同的順序出現。如果已停用,此函式會傳回
undefined
。排程器之間的啟動時間可能差異很大。目前,dirty 排程器在系統啟動時即會啟用,而 normal 排程器則會在啟用
scheduler_wall_time
功能後的一段時間啟用。此函數的回傳值中僅包含預期處理 CPU 密集型工作的排程器資訊。如果您也想要 dirty I/O 排程器的資訊,請改用
statistics(scheduler_wall_time_all)
。Normal 排程器的排程器識別碼範圍為
1 =< SchedulerId =<
erlang:system_info(schedulers)
。Dirty CPU 排程器的排程器識別碼範圍為erlang:system_info(schedulers) < SchedulerId =< erlang:system_info(schedulers) +
erlang:system_info(dirty_cpu_schedulers)
。注意
不同類型的排程器處理特定類型的工作。每個工作都會被指派給特定類型的排程器。工作可以在相同類型的不同排程器之間遷移,但絕不會在不同類型的排程器之間遷移。在評估回傳的結果時,必須將此事實納入考量。
您可以使用
scheduler_wall_time
來計算排程器的使用率。首先,您需要取得erlang:statistics(scheduler_wall_time)
回傳值的樣本。> erlang:system_flag(scheduler_wall_time, true). false > Ts0 = lists:sort(erlang:statistics(scheduler_wall_time)), ok. ok
稍後,使用者會取得另一個快照,並計算每個排程器的排程器使用率,例如:
> Ts1 = lists:sort(erlang:statistics(scheduler_wall_time)), ok. ok > lists:map(fun({{I, A0, T0}, {I, A1, T1}}) -> {I, (A1 - A0)/(T1 - T0)} end, lists:zip(Ts0,Ts1)). [{1,0.9743474730177548}, {2,0.9744843782751444}, {3,0.9995902361669045}, {4,0.9738012596572161}, {5,0.9717956667018103}, {6,0.9739235846420741}, {7,0.973237033077876}, {8,0.9741297293248656}]
使用相同的快照來計算總排程器使用率
> {A, T} = lists:foldl(fun({{_, A0, T0}, {_, A1, T1}}, {Ai,Ti}) -> {Ai + (A1 - A0), Ti + (T1 - T0)} end, {0, 0}, lists:zip(Ts0,Ts1)), TotalSchedulerUtilization = A/T. 0.9769136803764825
當所有排程器在兩次測量之間都處於活動狀態時,總排程器使用率將等於
1.0
。另一個(可能更有用)的值是計算根據最大可用 CPU 時間加權的總排程器使用率
> WeightedSchedulerUtilization = (TotalSchedulerUtilization * (erlang:system_info(schedulers) + erlang:system_info(dirty_cpu_schedulers))) / erlang:system_info(logical_processors_available). 0.9769136803764825
當排程器的活動時間與最大可用 CPU 時間相同時,此加權排程器使用率將達到
1.0
。如果排程器的數量多於可用的邏輯處理器數量,則此值可能大於1.0
。從 ERTS 9.0 版本開始,Erlang 運行時系統預設會擁有比邏輯處理器更多的排程器。這是由於 dirty 排程器的緣故。
注意
scheduler_wall_time
預設為停用。若要啟用它,請使用erlang:system_flag(scheduler_wall_time, true)
。自 OTP R15B01 版本起可用
statistics(scheduler_wall_time_all) -> [{Id :: pos_integer, ActiveTime :: non_neg_integer(), TotalTime :: non_neg_integer()}] | undefined
等同於
statistics(scheduler_wall_time)
,但它也包含所有 dirty I/O 排程器的資訊。Dirty IO 排程器的排程器識別碼範圍為
erlang:system_info(schedulers)
+
erlang:system_info(dirty_cpu_schedulers)
< SchedulerId =< erlang:system_info(schedulers) + erlang:system_info(dirty_cpu_schedulers) +
erlang:system_info(dirty_io_schedulers)
。注意
請注意,在 dirty I/O 排程器上執行的工作預期主要是在等待 I/O。也就是說,當您在 dirty I/O 排程器上獲得高排程器使用率時,由於此工作,CPU 使用率預期不會很高。
自 OTP 20.0 版本起可用
statistics(total_active_tasks) -> non_neg_integer()
等同於呼叫
lists:sum(
statistics(active_tasks)
)
,但效率更高。自 OTP 18.3 版本起可用
statistics(total_active_tasks_all) -> non_neg_integer()
等同於呼叫
lists:sum(
statistics(active_tasks_all)
)
,但效率更高。自 OTP 20.0 版本起可用
statistics(total_run_queue_lengths) -> non_neg_integer()
等同於呼叫
lists:sum(
statistics(run_queue_lengths)
)
,但效率更高。自 OTP 18.3 版本起可用
statistics(total_run_queue_lengths_all) -> non_neg_integer()
等同於呼叫
lists:sum(
statistics(run_queue_lengths_all)
)
,但效率更高。自 OTP 20.0 版本起可用
statistics(wall_clock) -> {Total :: non_neg_integer(), SinceLastCall :: non_neg_integer()}
回傳有關實際時間(wall clock)的資訊。
wall_clock
的使用方式與runtime
相同,不同之處在於它是測量實際時間,而不是執行時間或 CPU 時間。
-spec system_flag(backtrace_depth, Depth) -> OldDepth when Depth :: non_neg_integer(), OldDepth :: non_neg_integer(); (cpu_topology, CpuTopology) -> OldCpuTopology when CpuTopology :: cpu_topology(), OldCpuTopology :: cpu_topology(); (dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline) -> OldDirtyCPUSchedulersOnline when DirtyCPUSchedulersOnline :: pos_integer(), OldDirtyCPUSchedulersOnline :: pos_integer(); (erts_alloc, {Alloc, F, V}) -> ok | notsup when Alloc :: atom(), F :: atom(), V :: integer(); (fullsweep_after, Number) -> OldNumber when Number :: non_neg_integer(), OldNumber :: non_neg_integer(); (microstate_accounting, Action) -> OldState when Action :: true | false | reset, OldState :: true | false; (min_heap_size, MinHeapSize) -> OldMinHeapSize when MinHeapSize :: non_neg_integer(), OldMinHeapSize :: non_neg_integer(); (min_bin_vheap_size, MinBinVHeapSize) -> OldMinBinVHeapSize when MinBinVHeapSize :: non_neg_integer(), OldMinBinVHeapSize :: non_neg_integer(); (max_heap_size, MaxHeapSize) -> OldMaxHeapSize when MaxHeapSize :: max_heap_size(), OldMaxHeapSize :: max_heap_size(); (multi_scheduling, BlockState) -> OldBlockState when BlockState :: block | unblock | block_normal | unblock_normal, OldBlockState :: blocked | disabled | enabled; (outstanding_system_requests_limit, NewLimit) -> OldLimit when NewLimit :: 1..134217727, OldLimit :: 1..134217727; (scheduler_bind_type, How) -> OldBindType when How :: scheduler_bind_type() | default_bind, OldBindType :: scheduler_bind_type(); (scheduler_wall_time, Boolean) -> OldBoolean when Boolean :: boolean(), OldBoolean :: boolean(); (schedulers_online, SchedulersOnline) -> OldSchedulersOnline when SchedulersOnline :: pos_integer(), OldSchedulersOnline :: pos_integer(); (system_logger, Logger) -> PrevLogger when Logger :: logger | undefined | pid(), PrevLogger :: logger | undefined | pid(); (trace_control_word, TCW) -> OldTCW when TCW :: non_neg_integer(), OldTCW :: non_neg_integer(); (time_offset, finalize) -> OldState when OldState :: preliminary | final | volatile; (internal_cpu_topology, term()) -> term(); (sequential_tracer, Tracer) -> PrevTracer | false when Tracer :: pid() | port() | {module(), term()} | false, PrevTracer :: pid() | port() | {module(), term()} | false; (reset_seq_trace, true) -> true.
將系統旗標設定為給定的值。
可以設定的旗標如下:
system_flag(backtrace_depths, non_neg_integer()) -> non_neg_integer()
設定
'EXIT'
tuple 的結束原因元素中回溯呼叫堆疊的最大深度。此旗標也限制process_info/2
項目current_stacktrace
所回傳的堆疊追蹤深度。回傳旗標的舊值。
system_flag(cpu_topology, cpu_topology()) -> cpu_topology()
警告
此引數已棄用。請改為使用
+sct
這個在 erl 中的命令列引數。當移除此引數時,將會在模擬器啟動時決定要使用的最終 CPU 拓撲。
設定使用者定義的
CpuTopology
。使用者定義的 CPU 拓撲會覆寫任何自動偵測到的 CPU 拓撲。透過傳遞undefined
作為CpuTopology
,系統會還原為自動偵測到的 CPU 拓撲。回傳值等於變更前從erlang:system_info(cpu_topology)
回傳的值。回傳旗標的舊值。
當將排程器繫結至邏輯處理器時,會使用 CPU 拓撲。如果在變更 CPU 拓撲時已繫結排程器,則會向排程器發送請求,要求根據新的 CPU 拓撲重新繫結。
也可以透過將命令列引數
+sct
傳遞給 erl 來設定使用者定義的 CPU 拓撲。有關
CpuTopology
類型和更多資訊,請參閱erlang:system_info(cpu_topology)
以及 erl 中的命令列旗標+sct
和+sbt
。system_flag(dirty_cpu_schedulers_online, pos_integer()) -> pos_integer()
設定上線的 dirty CPU 排程器數量。範圍為
1 <= DirtyCPUSchedulersOnline <= N
,其中N
是erlang:system_info(dirty_cpu_schedulers)
和erlang:system_info(schedulers_online)
回傳值中的最小值。回傳旗標的舊值。
如果上線的排程器數量變更,則上線的 dirty CPU 排程器數量可能會變更。例如,如果 12 個排程器和 6 個 dirty CPU 排程器上線,且使用
system_flag/2
將上線的排程器數量設定為 6,則上線的 dirty CPU 排程器數量也會自動減少一半,降至 3。同樣地,上線的 dirty CPU 排程器數量會與上線的排程器數量成比例增加。如需更多資訊,請參閱
erlang:system_info(dirty_cpu_schedulers)
和erlang:system_info(dirty_cpu_schedulers_online)
。自 OTP 17.0 起可用
system_flag(erts_alloc, {Alloc :: atom(), F :: atom(), V :: integer()}) -> ok | notsup
設定
erts_alloc(3)
的系統旗標。Alloc
是要影響的配置器,例如binary_alloc
。F
是要變更的旗標,而V
是新值。只有所有
erts_alloc
旗標的子集可以在執行階段變更。此子集目前僅為旗標sbct
。如果已設定旗標,則回傳
ok
;如果erts_alloc
不支援,則回傳notsup
。自 OTP 20.2.3 起可用
system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()
設定系統旗標
fullsweep_after
。Number
是一個非負整數,表示在強制執行 fullsweep 收集之前,可以執行多少次世代垃圾收集。此值適用於新程序,而已經在執行的程序不受影響。回傳旗標的舊值。
在低記憶體系統中(尤其是在沒有虛擬記憶體的情況下),將此值設定為
0
有助於節省記憶體。也可以透過 (OS) 環境變數
ERL_FULLSWEEP_AFTER
來設定此值。system_flag(microstate_accounting, true | false | reset) -> boolean()
開啟/關閉微狀態會計測量。當傳遞 reset 時,所有計數器都會重設為 0。
如需更多資訊,請參閱
statistics(microstate_accounting)
。自 OTP 19.0 版本起可用
system_flag(min_heap_size, non_neg_integer()) -> non_neg_integer()
設定程序的預設最小堆積大小。大小以字為單位指定。新的
min_heap_size
只會影響在變更min_heap_size
之後產生的程序。可以使用spawn_opt/4
或process_flag/2
為個別程序設定min_heap_size
。回傳旗標的舊值。
system_flag(min_bin_vheap_size, non_neg_integer()) -> non_neg_integer()
設定程序的預設最小二進位虛擬堆積大小。大小以字為單位指定。新的
min_bin_vhheap_size
只會影響在變更min_bin_vheap_size
之後產生的程序。可以使用spawn_opt/2,3,4
或process_flag/2
為個別程序設定min_bin_vheap_size
。回傳旗標的舊值。
自 OTP R13B04 起可用
system_flag(max_heap_size, max_heap_size()) -> max_heap_size()
設定程序的預設最大堆積大小設定。大小以字為單位指定。新的
max_heap_size
只會影響在變更之後產生的程序。可以使用spawn_opt/2,3,4
或process_flag/2
為個別程序設定max_heap_size
。回傳旗標的舊值。
有關堆積如何增長的詳細資訊,請參閱 ERTS 內部文件中的調整堆積大小。
自 OTP 19.0 版本起可用
system_flag(multi_scheduling, BlockState) -> OldBlockState when BlockState :: block | unblock | block_normal | unblock_normal, OldBlockState :: blocked | disabled | enabled
如果已啟用多重排程,模擬器會使用多個排程器執行緒。可以使用兩種不同的方式封鎖多重排程。可以封鎖除一個以外的所有排程器,或封鎖除一個以外的所有正常排程器。當僅封鎖正常排程器時,dirty 排程器可以自由地繼續排程程序。
如果
BlockState =:= block
,則會封鎖多重排程。也就是說,只會有一個排程器執行緒執行。如果BlockState =:= unblock
,且沒有其他人封鎖多重排程,且此程序僅封鎖一次,則會解除封鎖多重排程。如果
BlockState =:= block_normal
,則會封鎖正常多重排程。也就是說,只有一個正常排程器執行緒會執行,但多個 dirty 排程器可以執行。如果BlockState =:= unblock_normal
,且沒有其他人封鎖正常多重排程,且此程序僅封鎖一次,則會解除封鎖正常多重排程。一個程序可以多次封鎖多重排程和正常多重排程。如果程序已封鎖多次,則它必須解除封鎖的次數與其封鎖的次數完全相同,才能釋放其多重排程封鎖。如果已封鎖多重排程或正常多重排程的程序結束,則會自動釋放其對多重排程和正常多重排程的封鎖。
回傳值為
disabled
、blocked
、blocked_normal
或enabled
。回傳值描述在呼叫erlang:system_flag(multi_scheduling, BlockState)
後的狀態。如需回傳值的資訊,請參閱erlang:system_info(multi_scheduling)
。注意
通常不需要封鎖多重排程和正常多重排程。如果您認為您需要使用這些功能,請再次考慮幾次。封鎖多重排程只能作為最後手段使用,因為它很可能是一種非常沒有效率的解決問題的方法。
另請參閱
erlang:system_info(multi_scheduling)
、erlang:system_info(normal_multi_scheduling_blockers)
、erlang:system_info(multi_scheduling_blockers)
和erlang:system_info(schedulers)
。system_flag(outstanding_system_requests_limit, 1..134217727) -> 1..134217727
限制協調系統範圍變更的系統程序所發出的未完成請求數量。目前有兩個此類程序
程式碼清除器 - 程式碼清除器協調舊程式碼從系統中移除之前對舊程式碼的參照檢查。
文字區域收集器 - 文字區域收集器協調從舊文字區域複製參照,然後從系統中移除這些區域。
允許每個這些程序擁有與此限制所設定數量一樣多的未完成請求。預設情況下,此限制設定為系統上排程器數量的兩倍。這將確保排程器有足夠的工作要排程,以盡快執行這些操作,同時其他工作也會穿插執行。目前使用的限制可以透過呼叫
erlang:system_info(outstanding_system_requests_limit)
來檢查。也可以透過將命令列引數
+zosrl <Limit>
傳遞給erl
來設定此限制。自 OTP 24.2 起可用
system_flag(scheduler_bind_type, scheduler_bind_type() | default_bind) -> scheduler_bind_type()
警告
此引數已過時。請改用
+sbt
這個命令列引數,而非使用此引數,詳情請參閱 erl。當此引數移除後,將會在模擬器啟動時決定要使用的最終排程器綁定類型。控制排程器是否以及如何綁定到邏輯處理器。
當呼叫
erlang:system_flag(scheduler_bind_type, How)
時,會傳送一個非同步訊號給所有上線的排程器,使其嘗試依照要求綁定或解除綁定。注意
如果排程器無法綁定,通常會被靜默忽略,因為並非總是能驗證有效的邏輯處理器識別碼。如果回報錯誤,則會記錄一個錯誤事件。要驗證排程器是否已依照要求綁定,請呼叫
erlang:system_info(scheduler_bindings)
。排程器可以在較新的 Linux、Solaris、FreeBSD 和 Windows 系統上綁定,但未來版本將支援更多系統。
為了使執行期系統能夠綁定排程器,必須知道 CPU 拓樸。如果執行期系統無法自動偵測到 CPU 拓樸,則可以自行定義。有關如何定義 CPU 拓樸的更多資訊,請參閱 erl 中的命令列旗標
+sct
。預設情況下,執行期系統不會將排程器綁定到邏輯處理器。
注意
如果 Erlang 執行期系統是唯一將執行緒綁定到邏輯處理器的 OS 處理程序,則可以提高執行期系統的效能。但是,如果其他 OS 處理程序(例如,另一個 Erlang 執行期系統)也將執行緒綁定到邏輯處理器,則反而會產生效能損失。有時這種效能損失可能很嚴重。如果發生這種情況,建議不要綁定排程器。
排程器可以用不同的方式綁定。引數
How
決定排程器的綁定方式,可以是下列任何一種:thread_no_node_processor_spread
- 與 erl 中的命令列引數+sbt tnnps
相同。
傳回值等於變更旗標
scheduler_bind_type
之前的值How
。失敗
notsup
- 如果不支援排程器的綁定。badarg
- 如果How
不是文件中記載的選項之一。badarg
- 如果 CPU 拓樸資訊不可用。
也可以透過將命令列引數
+sbt
傳遞給 erl 來設定排程器綁定類型。如需更多資訊,請參閱
erlang:system_info(scheduler_bind_type)
、erlang:system_info(scheduler_bindings)
,以及 erl 中的命令列旗標+sbt
和+sct
。system_flag(scheduler_wall_time, boolean()) -> boolean()
嘗試透過傳遞
Boolean
作為true
或false
來啟用或停用排程器牆鐘時間測量。如需更多關於如何使用排程器牆鐘時間測量的資訊,請參閱
statistics(scheduler_wall_time)
。排程器牆鐘時間測量具有節點全域狀態。它對於節點上的所有處理程序來說,要么是啟用,要么是停用。每個處理程序都有一個邏輯計數器,初始化為零。使用
Boolean
作為true
的呼叫會將呼叫處理程序的計數器增加一步。使用false
的呼叫會將其減少一步,除非它已經為零。scheduler_wall_time
的節點全域狀態將會啟用,只要至少有一個處理程序的計數器值大於零。當處理程序終止時,其計數器也會消失。為了確保scheduler_wall_time
保持啟用狀態,因此啟用它的處理程序必須保持存活。傳回節點全域狀態的舊值,如果排程器牆鐘時間測量已啟用,則傳回
true
,如果已停用,則傳回false
。排程器牆鐘時間測量會消耗一些 CPU 額外負擔,除非使用,否則不應保持開啟狀態。
自 OTP R15B01 版本起可用
system_flag(schedulers_online, pos_integer()) -> pos_integer()
設定上線排程器的數量。範圍是
1 <= SchedulersOnline <= erlang:system_info(schedulers)
。回傳旗標的舊值。
如果模擬器建置時支援dirty 排程器,則變更上線排程器的數量也會變更上線 dirty CPU 排程器的數量。例如,如果 12 個排程器和 6 個 dirty CPU 排程器上線,並且使用
system_flag/2
將上線排程器的數量設定為 6,則上線 dirty CPU 排程器的數量也會自動減少一半,降至 3 個。同樣地,上線 dirty CPU 排程器的數量會隨著上線排程器數量的增加而按比例增加。如需更多資訊,請參閱
erlang:system_info(schedulers)
和erlang:system_info(schedulers_online)
。system_flag(system_logger, logger | undefined | pid()) -> logger | undefined | pid()
設定將接收 ERTS 產生之記錄訊息的處理程序。如果設定為
undefined
,則 ERTS 產生的所有記錄訊息都將被丟棄。訊息的格式如下{log,Level,Format,ArgList,Metadata} where Level = atom(), Format = string(), ArgList = list(term()), Metadata = #{ pid => pid(), group_leader => pid(), time := logger:timestamp(), error_logger := #{ emulator := true, tag := atom() }
如果
system_logger
處理程序死掉,此旗標將會重設為logger
。預設值為名為
logger
的處理程序。回傳旗標的舊值。
注意
此函式設計為由 KERNEL
logger
使用。如果您將其變更為其他值,請小心,因為記錄訊息可能會遺失。如果您想要攔截模擬器記錄訊息,請透過在 KERNEL logger 中新增專用的處理常式來進行。自 OTP 21.2 起可用
system_flag(trace_control_word, non_neg_integer()) -> non_neg_integer()
將節點追蹤控制字的值設定為
TCW
,其必須為一個無號整數。如需更多資訊,請參閱使用者指南中「Erlang 中的比對規格」章節中的函式set_tcw
。回傳旗標的舊值。
system_flag(time_offset, finalize) -> preliminary | final | volatile
當使用單一時間扭曲模式時,會最終確定時間偏移量。如果使用其他時間扭曲模式,則時間偏移量狀態將保持不變。
傳回舊的狀態識別碼,即
- 如果傳回
preliminary
,則表示已執行最終確定,且時間偏移量現在為最終值。 - 如果傳回
final
,則表示時間偏移量已經處於最終狀態。這可能是因為另一個erlang:system_flag(time_offset, finalize)
呼叫,或者因為使用了無時間扭曲模式。 - 如果傳回
volatile
,則表示時間偏移量無法最終確定,因為使用了多重時間扭曲模式。
自 OTP 18.0 起可用
- 如果傳回
-spec system_info(allocated_areas) -> [tuple()]; (allocator) -> {Allocator, Version, Features, Settings} when Allocator :: undefined | glibc, Version :: [non_neg_integer()], Features :: [atom()], Settings :: [{Subsystem :: atom(), [{Parameter :: atom(), Value :: term()}]}]; ({allocator, Alloc}) -> [_] when Alloc :: atom(); (alloc_util_allocators) -> [Alloc] when Alloc :: atom(); ({allocator_sizes, Alloc}) -> [_] when Alloc :: atom(); (atom_count) -> pos_integer(); (atom_limit) -> pos_integer(); (build_type) -> opt | debug | gcov | valgrind | gprof | lcnt | frmptr; (c_compiler_used) -> {atom(), term()}; (check_io) -> [_]; (compat_rel) -> integer(); (cpu_topology) -> CpuTopology when CpuTopology :: cpu_topology(); ({cpu_topology, defined | detected | used}) -> CpuTopology when CpuTopology :: cpu_topology(); (cpu_quota) -> pos_integer() | unknown; (creation) -> integer(); (debug_compiled) -> boolean(); (delayed_node_table_gc) -> infinity | non_neg_integer(); (dirty_cpu_schedulers) -> non_neg_integer(); (dirty_cpu_schedulers_online) -> non_neg_integer(); (dirty_io_schedulers) -> non_neg_integer(); (dist) -> binary(); (dist_buf_busy_limit) -> non_neg_integer(); (dist_ctrl) -> [{Node :: node(), ControllingEntity :: port() | pid()}]; (driver_version) -> string(); (dynamic_trace) -> none | dtrace | systemtap; (dynamic_trace_probes) -> boolean(); (eager_check_io) -> boolean(); (emu_flavor) -> emu | jit; (emu_type) -> opt | debug | gcov | valgrind | gprof | lcnt | frmptr; (end_time) -> non_neg_integer(); (ets_count) -> pos_integer(); (ets_limit) -> pos_integer(); (fullsweep_after) -> {fullsweep_after, non_neg_integer()}; (garbage_collection) -> garbage_collection_defaults(); (heap_sizes) -> [non_neg_integer()]; (heap_type) -> private; (info) -> binary(); (kernel_poll) -> boolean(); (loaded) -> binary(); (logical_processors | logical_processors_available | logical_processors_online) -> unknown | pos_integer(); (machine) -> string(); (max_heap_size) -> {max_heap_size, MaxHeapSize :: max_heap_size()}; (message_queue_data) -> message_queue_data(); (min_heap_size) -> {min_heap_size, MinHeapSize :: pos_integer()}; (min_bin_vheap_size) -> {min_bin_vheap_size, MinBinVHeapSize :: pos_integer()}; (modified_timing_level) -> integer() | undefined; (multi_scheduling) -> disabled | blocked | blocked_normal | enabled; (multi_scheduling_blockers) -> [Pid :: pid()]; (nif_version) -> string(); (normal_multi_scheduling_blockers) -> [Pid :: pid()]; (otp_release) -> string(); (os_monotonic_time_source) -> [{atom(), term()}]; (os_system_time_source) -> [{atom(), term()}]; (outstanding_system_requests_limit) -> 1..134217727; (port_parallelism) -> boolean(); (port_count) -> non_neg_integer(); (port_limit) -> pos_integer(); (process_count) -> pos_integer(); (process_limit) -> pos_integer(); (procs) -> binary(); (scheduler_bind_type) -> scheduler_bind_type(); (scheduler_bindings) -> tuple(); (scheduler_id) -> SchedulerId :: pos_integer(); (schedulers | schedulers_online) -> pos_integer(); (smp_support) -> boolean(); (start_time) -> integer(); (system_architecture) -> string(); (system_logger) -> logger | undefined | pid(); (system_version) -> string(); (threads) -> boolean(); (thread_pool_size) -> non_neg_integer(); (time_correction) -> true | false; (time_offset) -> preliminary | final | volatile; (time_warp_mode) -> no_time_warp | single_time_warp | multi_time_warp; (tolerant_timeofday) -> enabled | disabled; (trace_control_word) -> non_neg_integer(); (update_cpu_info) -> changed | unchanged; (version) -> string(); (wordsize | {wordsize, internal} | {wordsize, external}) -> 4 | 8; (async_dist) -> boolean(); (halt_flush_timeout) -> non_neg_integer() | infinity.
返回有關目前系統的資訊。
為了方便瀏覽,此函式的說明文件分為以下幾個部分。
記憶體配置
-allocated_areas
、allocator
、alloc_util_allocators
、allocator_sizes
處理程序資訊
-fullsweep_after
、garbage_collection
、heap_sizes
、heap_type
、max_heap_size
、message_queue_data
、min_heap_size
、min_bin_vheap_size
、procs
系統限制
-atom_count
、atom_limit
、ets_count
、ets_limit
、port_count
、port_limit
、process_count
、process_limit
系統時間
-end_time
、os_monotonic_time_source
、os_system_time_source
、start_time
、time_correction
、time_offset
、time_warp_mode
、tolerant_timeofday
排程器資訊
-dirty_cpu_schedulers
、dirty_cpu_schedulers_online
、dirty_io_schedulers
、multi_scheduling
、multi_scheduling_blockers
、normal_multi_scheduling_blockers
、scheduler_bind_type
、scheduler_bindings
、scheduler_id
、schedulers
、smp_support
、threads
、thread_pool_size
分配資訊
-creation
、delayed_node_table_gc
、dist
、dist_buf_busy_limit
、dist_ctrl
系統資訊
-c_compiler_used
、check_io
、compat_rel
、debug_compiled
、driver_version
、dynamic_trace
、dynamic_trace_probes
、emu_flavor
、emu_type
、info
、kernel_poll
、loaded
、machine
、modified_timing_level
、nif_version
、otp_release
、outstanding_system_requests_limit
、port_parallelism
、system_architecture
、system_logger
、system_version
、trace_control_word
、version
、wordsize
記憶體分配
依照 Item
指定,傳回目前系統(模擬器)的記憶體分配器相關資訊。
allocated_areas
- 傳回[tuple()]
,其中包含雜項已分配記憶體區域的資訊。每個元組的第一個元素包含描述記憶體類型的原子,第二個元素包含已分配的記憶體量(以位元組為單位)。如果存在已分配和已使用記憶體的資訊,則也會存在第三個元素,其中包含已使用的記憶體量(以位元組為單位)。
erlang:system_info(allocated_areas)
用於偵錯,其內容高度依賴於實作。因此,在沒有事先通知的情況下,結果的內容會根據需要而變更。請注意,這些值的總和*並非*模擬器分配的總記憶體量。某些值是其他值的一部分,而且某些記憶體區域不屬於結果的一部分。如需關於模擬器分配的總記憶體量資訊,請參閱
erlang:memory/0,1
。
allocator
- 傳回{Allocator :: undefined | glibc, Version :: [non_neg_integer()], Features :: [atom()], Settings :: [{Subsystem :: atom(), [{Parameter :: atom(), Value :: term()}] }] }
其中
Allocator
對應於使用的malloc()
實作。如果Allocator
等於undefined
,則無法識別使用的malloc()
實作。glibc
可以被識別。Version
是一個整數列表(而不是字串),表示使用的malloc()
實作的版本。Features
是一個原子列表,表示使用的分配功能。Settings
是一個子系統列表、其可設定的參數以及使用的值。設定在不同的平台、分配器和分配功能組合之間可能會有所不同。記憶體大小以位元組為單位。
另請參閱
erts_alloc(3)
中的「影響 erts_alloc 的系統旗標」。{allocator, Alloc}
- 傳回指定分配器的相關資訊。從 ERTS 5.6.1 開始,傳回值為{instance, InstanceNo, InstanceInfo}
元組的列表,其中InstanceInfo
包含有關分配器特定實例的資訊。如果Alloc
不是已識別的分配器,則會傳回undefined
。如果Alloc
已停用,則會傳回false
。請注意,傳回的資訊高度依賴於實作,並可能隨時在沒有事先通知的情況下變更或移除。它最初是作為開發新分配器時的工具,但由於其他人也可能感興趣,因此簡要地說明了此內容。
已識別的分配器列在
erts_alloc(3)
中。有關超級載體的資訊可以從 ERTS 8.0 中使用{allocator, erts_mmap}
取得,或從 ERTS 5.10.4 取得;使用{allocator, mseg_alloc}
呼叫時傳回的列表也包含{erts_mmap, _}
元組作為列表中的一個元素。閱讀
erts_alloc(3)
文件後,傳回的資訊或多或少是不言而喻的,但可能值得解釋一些內容。呼叫計數由兩個值表示,第一個值是千兆次呼叫,第二個值是呼叫。mbcs
和sbcs
分別表示多區塊載體和單區塊載體。大小以位元組為單位表示。當未顯示大小時,表示某物的數量。大小和數量通常由三個值表示- 第一個是目前值。
- 第二個是自上次呼叫
erlang:system_info({allocator, Alloc})
以來的最大值。 - 第三個是自模擬器啟動以來的最大值。
如果只存在一個值,則為目前值。
fix_alloc
記憶體區塊類型由兩個值表示。第一個值是記憶體集區大小,第二個值是已使用的記憶體大小。alloc_util_allocators
- 傳回使用 ERTS 內部alloc_util
框架的所有分配器的名稱列表,以原子表示。如需更多資訊,請參閱erts_alloc(3)
中的alloc_util 框架章節。{allocator_sizes, Alloc}
- 傳回指定分配器的各種大小資訊。傳回的資訊是erlang:system_info({allocator, Alloc})
傳回的資訊子集。
CPU 拓撲
依照 Item
指定,傳回目前系統(模擬器)的 CPU 拓撲相關資訊。
cpu_topology
- 傳回模擬器目前使用的t:cpu_topology()
。CPU 拓撲用於將排程器繫結至邏輯處理器。使用的 CPU 拓撲是使用者定義的 CPU 拓撲(如果存在),否則為自動偵測到的 CPU 拓撲(如果存在)。如果不存在 CPU 拓撲,則會傳回undefined
。{cpu_topology, defined}
- 傳回使用者定義的t:cpu_topology()
。如需更多資訊,請參閱erl(1)
中的命令列旗標+sct
和引數cpu_topology
。{cpu_topology, detected}
- 傳回自動偵測到的t:cpu_topology()
。模擬器會在某些較新的 Linux、Solaris、FreeBSD 和 Windows 系統上偵測 CPU 拓撲。在具有超過 32 個邏輯處理器的 Windows 系統上,不會偵測到 CPU 拓撲。如需更多資訊,請參閱引數
cpu_topology
。{cpu_topology, used}
- 傳回模擬器使用的CpuTopology
。如需更多資訊,請參閱引數cpu_topology
。logical_processors
- 傳回系統中已設定的已偵測到的邏輯處理器數量。如果模擬器無法偵測到已設定的邏輯處理器,則傳回值為整數或原子unknown
。logical_processors_available
- 傳回 Erlang 執行階段系統可用的已偵測到邏輯處理器數量。如果模擬器無法偵測到可用的邏輯處理器,則傳回值為整數或原子unknown
。可用邏輯處理器的數量小於或等於線上邏輯處理器的數量。logical_processors_online
- 傳回系統中已上線的已偵測到邏輯處理器數量。如果模擬器無法偵測到線上邏輯處理器,則傳回值為整數或原子unknown
。線上邏輯處理器的數量小於或等於已設定的邏輯處理器的數量。cpu_quota
- 傳回模擬器受限的已偵測到 CPU 配額。傳回值是一個整數,表示我們獲得的執行階段處理器數量(介於 1 和邏輯處理器數量之間),如果模擬器無法偵測到配額,則會傳回原子unknown
。update_cpu_info
- 執行階段系統會重新讀取可用的 CPU 資訊,並更新其內部儲存的已偵測到的 CPU 拓撲以及邏輯處理器已設定、線上、可用和 CPU 配額的相關資訊。如果 CPU 資訊自上次讀取以來已變更,則會傳回原子
changed
,否則會傳回原子unchanged
。如果 CPU 資訊已變更,您可能需要調整線上排程器的數量。您通常會希望盡可能多的線上排程器數量等於可用的邏輯處理器數量。Since: OTP R14B
程序資訊
傳回有關預設程序堆積設定的資訊
fullsweep_after
- 傳回{fullsweep_after, integer() >= 0}
,這是預設使用的fullsweep_after
垃圾收集設定。如需更多資訊,請參閱下面描述的garbage_collection
。garbage_collection
- 傳回描述預設垃圾收集設定的garbage_collection_defaults/0
。由spawn
或spawn_link
在本機節點上衍生出的程序會使用這些垃圾收集設定。可以使用erlang:system_flag/2
變更預設設定。spawn_opt/2,3,4
可以衍生出不使用預設設定的程序。heap_sizes
- 傳回一個整數列表,表示以字為單位的有效堆積大小。所有 Erlang 堆積的大小都來自此列表中的大小。heap_type
- 傳回目前模擬器使用的堆積類型。存在一種堆積類型private
- 每個程序都有為其保留的堆積空間,且不同程序的堆積空間之間不允許有參照。在程序之間傳遞的訊息會在堆積空間之間複製。
max_heap_size
- 傳回{max_heap_size, MaxHeapSize}
,其中MaxHeapSize
是目前系統範圍內為衍生程序設定的最大堆積空間大小。此設定可以使用命令列標記+hmax
、+hmaxk
、+hmaxel
和+hmaxibl
在erl(1)
中設定。也可以在執行時使用erlang:system_flag(max_heap_size, MaxHeapSize)
變更。關於max_heap_size
程序標記的更多詳細資訊,請參閱process_flag(max_heap_size, MaxHeapSize)
。自:OTP 19.0 起
message_queue_data
- 傳回message_queue_data
程序標記的預設值,該值可以是off_heap
或on_heap
。預設值由erl(1)
中的命令列引數+hmqd
設定。有關更多資訊,請參閱process_flag(message_queue_data, MQD)
的文件。自:OTP 19.0 起
min_heap_size
- 傳回{min_heap_size, MinHeapSize}
,其中MinHeapSize
是目前系統範圍內為衍生程序設定的最小堆積空間大小。自:OTP R13B04 起
min_bin_vheap_size
- 傳回{min_bin_vheap_size, MinBinVHeapSize}
,其中MinBinVHeapSize
是目前系統範圍內為衍生程序設定的最小二進位虛擬堆積空間大小。自:OTP R13B04 起
procs
- 傳回一個二進位檔案,其中包含格式與 Erlang 當機傾印檔相同的程序和連接埠資訊字串。有關更多資訊,請參閱使用者指南中的 如何解讀 Erlang 當機傾印檔 章節。
系統限制
根據 Item
指定,傳回關於目前系統(模擬器)限制的資訊
atom_count
- 傳回目前本機節點中存在的原子數量。該值以整數形式給出。自:OTP 20.0 起
atom_limit
- 傳回允許的最大原子數量。此限制可以在啟動時透過將命令列標記+t
傳遞給erl(1)
來增加。自:OTP 20.0 起
ets_count
- 傳回目前本機節點中存在的 ETS 表格數量。自:OTP 21.1 起
ets_limit
- 傳回 ETS 表格數量的限制。此限制部分已過時,表格數量僅受可用記憶體的限制。自:OTP R16B03 起
port_count
- 傳回目前本機節點中存在的連接埠數量。該值以整數形式給出。這與length(erlang:ports())
傳回的值相同,但效率更高。自:OTP R16B 起
port_limit
- 以整數形式傳回本機節點同時存在的最大連接埠數量。此限制可以使用erl(1)
中的命令列標記+Q
在啟動時設定。自 OTP R16B 起
process_count
- 傳回目前本機節點中存在的程序數量。該值以整數形式給出。這與length(processes())
傳回的值相同,但效率更高。process_limit
- 傳回本機節點同時存在的最大程序數量。該值以整數形式給出。此限制可以使用erl(1)
中的命令列標記+P
在啟動時設定。
系統時間
根據 Item
指定,傳回關於目前系統(模擬器)時間的資訊
end_time
- 在目前的 Erlang 執行時期系統實例中,內部可以表示的最後一個 Erlang 單調時間,以native
時間單位 表示。 開始時間和結束時間之間的時間至少為四分之一千年。自:OTP 18.0 起
os_monotonic_time_source
- 傳回一個清單,其中包含關於執行時期系統所使用的 作業系統單調時間來源的資訊。如果傳回
[]
,則表示沒有可用的作業系統單調時間。該清單包含二元組,其中Key
作為第一個元素,而Value
作為第二個元素。這些元組的順序是未定義的。以下元組可以成為清單的一部分,但未來可能會引入更多元組{function, Function}
-Function
是所使用的函數名稱。如果執行時期系統可以使用作業系統單調時間,則此元組始終存在。{clock_id, ClockId}
- 僅當Function
可以與不同的時鐘一起使用時,此元組才存在。ClockId
對應於呼叫Function
時使用的時鐘識別碼。{resolution, OsMonotonicTimeResolution}
- 以每秒部分表示的當前作業系統單調時間來源的最高可能解析度。如果無法從作業系統檢索解析度資訊,則OsMonotonicTimeResolution
會設定為Function
的傳回值時間單位的解析度。也就是說,實際解析度可能低於OsMonotonicTimeResolution
。請注意,解析度並未說明任何關於準確性或精確度是否與解析度一致的資訊。但是,您確實知道精確度不會優於OsMonotonicTimeResolution
。{used_resolution, UsedOsMonotonicTimeResolution}
- 執行時期系統使用的作業系統單調時間解析度。這通常與OsMonotonicTimeResolution
相同。但是,在某些系統上,必須降低解析度才能可靠地產生單調時間戳記。例如,當在 Windows 上使用QueryPerformanceCounter()
作為作業系統單調時間來源時。如果已執行這種解析度降低,則UsedOsMonotonicTimeResolution
將小於OsMonotonicTimeResolution
。{extended, Extended}
- 如果時間值的範圍已擴充,則Extended
等於yes
;否則,Extended
等於no
。如果Function
傳回的值快速迴繞,則必須擴充範圍。當傳回值為 32 位元值時,通常會發生這種情況。{parallel, Parallel}
- 如果Function
是從多個執行緒並行呼叫,則Parallel
等於yes
。如果不是並行呼叫,因為呼叫必須序列化,則Parallel
等於no
。{time, OsMonotonicTime}
-OsMonotonicTime
等於目前作業系統單調時間,以native
時間單位 表示。
自:OTP 18.0 起
os_system_time_source
- 傳回一個清單,其中包含關於執行時期系統所使用的 作業系統系統時間來源的資訊。該清單包含二元組,其中
Key
作為第一個元素,而Value
作為第二個元素。這些元組的順序是未定義的。以下元組可以成為清單的一部分,但未來可能會引入更多元組{function, Function}
-Function
是所使用的函數名稱。{clock_id, ClockId}
- 僅當Function
可以與不同的時鐘一起使用時,才存在。ClockId
對應於呼叫Function
時使用的時鐘識別碼。{resolution, OsSystemTimeResolution}
- 以每秒部分表示的當前作業系統系統時間來源的最高可能解析度。如果無法從作業系統檢索解析度資訊,則OsSystemTimeResolution
會設定為Function
的傳回值時間單位的解析度。也就是說,實際解析度可能低於OsSystemTimeResolution
。請注意,解析度並未說明任何關於準確性或精確度是否與解析度一致的資訊。但是,您確實知道精確度不會優於OsSystemTimeResolution
。{parallel, Parallel}
- 如果Function
是從多個執行緒並行呼叫,則Parallel
等於yes
。如果不是並行呼叫,因為呼叫需要序列化,則Parallel
等於no
。{time, OsSystemTime}
-OsSystemTime
等於目前作業系統系統時間,以native
時間單位 表示。
自:OTP 18.0 起
start_time
- 在目前 Erlang 執行時期系統實例開始時的 Erlang 單調時間,以native
時間單位 表示。另請參閱
erlang:system_info(end_time)
。自:OTP 18.0 起
time_correction
- 傳回一個t:boolean()
值,指示是否啟用時間校正。自:OTP 18.0 起
time_offset
- 傳回時間偏移量的狀態preliminary
- 時間偏移量是初步的,稍後會變更和最終確定。初步時間偏移量用於單次時間扭曲模式的初步階段。final
- 時間偏移量是最終的。原因可能是使用了無時間扭曲模式,或是因為使用單次時間扭曲模式時,時間偏移量已最終確定。volatile
- 時間偏移量是不穩定的。也就是說,它隨時都可能變更。這是因為使用了多次時間扭曲模式。
自:OTP 18.0 起
time_warp_mode
- 傳回一個數值,識別目前使用的時間扭曲模式。自:OTP 18.0 起
tolerant_timeofday
- 傳回是否啟用為了與 ERTS 7.0 之前的版本回溯相容而對系統時間突然變更進行的補償,值為enabled
或disabled
。當時間偏移為final
,且時間校正已啟用時,此補償會enabled
。自:OTP 17.1
排程器資訊
依照 Item
指定,傳回目前系統中關於排程器、排程和執行緒的資訊。
dirty_cpu_schedulers
- 傳回模擬器使用的 dirty CPU 排程器執行緒數量。Dirty CPU 排程器執行 CPU 密集的原生函式,例如 NIF、連結的驅動程式碼以及無法由一般模擬器排程器乾淨地管理的 BIF。Dirty CPU 排程器執行緒的數量在模擬器啟動時決定,之後無法更改。然而,上線的 dirty CPU 排程器執行緒數量可以隨時更改。Dirty CPU 排程器的數量可以在啟動時,透過在
erl(1)
中傳遞命令列旗標+SDcpu
或+SDPcpu
來設定。另請參閱
erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)
、erlang:system_info(dirty_cpu_schedulers_online)
、erlang:system_info(dirty_io_schedulers)
、erlang:system_info(schedulers)
、erlang:system_info(schedulers_online)
和erlang:system_flag(schedulers_online, SchedulersOnline)
。自:OTP 17.0
dirty_cpu_schedulers_online
- 傳回上線的 dirty CPU 排程器數量。傳回值滿足1 <= DirtyCPUSchedulersOnline <= N
,其中N
是erlang:system_info(dirty_cpu_schedulers)
和erlang:system_info(schedulers_online)
傳回值中較小的值。上線的 dirty CPU 排程器數量可以在啟動時,透過在
erl(1)
中傳遞命令列旗標+SDcpu
來設定。如需更多資訊,請參閱
erlang:system_info(dirty_cpu_schedulers)
、erlang:system_info(dirty_io_schedulers)
、erlang:system_info(schedulers_online)
和erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)
。自:OTP 17.0
dirty_io_schedulers
- 傳回 dirty I/O 排程器的數量,以整數表示。Dirty I/O 排程器執行 I/O 密集的原生函式,例如 NIF 和連結的驅動程式碼,這些程式碼無法由一般的模擬器排程器乾淨地管理。此值可以在啟動時,透過在
erl(1)
中傳遞命令列參數+SDio
來設定。如需更多資訊,請參閱
erlang:system_info(dirty_cpu_schedulers)
、erlang:system_info(dirty_cpu_schedulers_online)
和erlang:system_flag(dirty_cpu_schedulers_online, DirtyCPUSchedulersOnline)
。自:OTP 17.0
multi_scheduling
- 傳回下列其中一個值:disabled
- 模擬器已啟動,僅有一個排程器執行緒。blocked
- 模擬器有多個排程器執行緒,但除了一個之外,所有排程器執行緒都已封鎖。也就是說,只有一個排程器執行緒會排程 Erlang 程序並執行 Erlang 程式碼。blocked_normal
- 模擬器有多個排程器執行緒,但除了一個之外,所有一般排程器執行緒都已封鎖。請注意,dirty 排程器不會被封鎖,並且可以排程 Erlang 程序和執行原生程式碼。enabled
- 模擬器有多個排程器執行緒,且沒有任何排程器執行緒被封鎖。也就是說,所有可用的排程器執行緒都會排程 Erlang 程序並執行 Erlang 程式碼。
另請參閱
erlang:system_flag(multi_scheduling, BlockState)
、erlang:system_info(multi_scheduling_blockers)
、erlang:system_info(normal_multi_scheduling_blockers)
和erlang:system_info(schedulers)
。multi_scheduling_blockers
- 當多重排程被封鎖時,傳回Pid
的列表,否則傳回空列表。列表中的Pid
代表目前正在封鎖多重排程的所有程序。即使對應的程序已封鎖多次,Pid
在列表中也只會出現一次。另請參閱
erlang:system_flag(multi_scheduling, BlockState)
、erlang:system_info(multi_scheduling)
、erlang:system_info(normal_multi_scheduling_blockers)
和erlang:system_info(schedulers)
。normal_multi_scheduling_blockers
- 當正常多重排程被封鎖時(也就是說,除了有一個之外,所有正常排程器都被封鎖),傳回Pid
的列表,否則傳回空列表。列表中的Pid
代表目前正在封鎖正常多重排程的所有程序。即使對應的程序已封鎖多次,Pid
在列表中也只會出現一次。另請參閱
erlang:system_flag(multi_scheduling, BlockState)
、erlang:system_info(multi_scheduling)
、erlang:system_info(multi_scheduling_blockers)
和erlang:system_info(schedulers)
。自:OTP 19.0 起
scheduler_bind_type
- 傳回t:scheduler_bind_type()
,關於使用者如何請求排程器綁定或不綁定的資訊。請注意,即使使用者已請求綁定排程器,它們也可能會靜默地綁定失敗。若要檢查排程器綁定,請呼叫
erlang:system_info(scheduler_bindings)
。如需更多資訊,請參閱
erl(1)
中的命令列參數+sbt
和erlang:system_info(scheduler_bindings)
。scheduler_bindings
- 傳回目前使用的排程器綁定資訊。會傳回大小等於
erlang:system_info(schedulers)
的元組。元組元素是整數或原子unbound
。邏輯處理器識別碼以整數表示。元組的第N
個元素等於排程器識別碼等於N
的排程器的目前綁定。例如,如果排程器已綁定,element(erlang:system_info(scheduler_id), erlang:system_info(scheduler_bindings))
會傳回呼叫程序正在執行的邏輯處理器的識別碼。請注意,只有上線的排程器才能綁定到邏輯處理器。
如需更多資訊,請參閱
erl(1)
中的命令列參數+sbt
和erlang:system_info(schedulers_online)
。scheduler_id
- 傳回呼叫程序正在執行的排程器執行緒的排程器 ID (SchedulerId
)。SchedulerId
是一個正整數,其中1 <= SchedulerId <= erlang:system_info(schedulers)
。schedulers
- 傳回模擬器使用的排程器執行緒數量。上線的排程器執行緒會排程 Erlang 程序和 Erlang 連接埠,並執行 Erlang 程式碼和 Erlang 連結的驅動程式碼。排程器執行緒的數量在模擬器啟動時決定,之後無法更改。然而,上線的排程器數量可以隨時更改。
另請參閱
erlang:system_flag(schedulers_online, SchedulersOnline)
、erlang:system_info(schedulers_online)
、erlang:system_info(scheduler_id)
、erlang:system_flag(multi_scheduling, BlockState)
、erlang:system_info(multi_scheduling)
、erlang:system_info(normal_multi_scheduling_blockers)
和erlang:system_info(multi_scheduling_blockers)
。schedulers_online
- 傳回上線的排程器數量。上線的排程器的排程器識別碼滿足關係1 <= SchedulerId <= erlang:system_info(schedulers_online)
。如需更多資訊,請參閱
erlang:system_info(schedulers)
和erlang:system_flag(schedulers_online, SchedulersOnline)
。smp_support
- 傳回true
。threads
- 傳回true
。thread_pool_size
- 傳回用於非同步驅動程式呼叫 (erl_driver:driver_async()
) 的非同步執行緒集區中的非同步執行緒數量。該值以整數表示。
分散式資訊
依照 Item
指定,傳回目前系統中關於 Erlang 分散式的資訊。
async_dist
- 傳回執行階段系統使用的命令列引數 +pad <boolean> 的值。此值決定新產生程序的預設async_dist
值。自:OTP 25.3
creation
- 傳回本機節點的「建立」值,以整數表示。當節點重新啟動時,建立值會變更。節點的建立值會儲存在程序識別碼、連接埠識別碼和參照中。這樣可以區分來自節點不同化身的識別碼。建立值目前是 32 位元的正整數,但未來版本中可能會變更。如果節點未啟用,則傳回0
。delayed_node_table_gc
- 傳回節點表中條目延遲垃圾回收的時間長度,以秒為單位。此限制可以在啟動時,透過傳遞命令列標誌+zdntgc
給erl(1)
來設定。更多資訊,請參閱命令列標誌的說明文件。自:OTP 18.0 起
dist
- 傳回一個二進制資料,其中包含格式化為 Erlang 崩潰傾印的散佈資訊字串。更多資訊,請參閱使用者指南中的 如何解讀 Erlang 崩潰傾印 章節。dist_buf_busy_limit
- 傳回散佈緩衝區忙碌限制的值,以位元組為單位。此限制可以在啟動時,透過傳遞命令列標誌+zdbbl
給erl(1)
來設定。自:OTP R14B01
dist_ctrl
- 傳回一個元組列表{Node :: node(), ControllingEntity :: port() | pid()}
,每個已連線的遠端節點各有一個條目。Node
是節點名稱,而ControllingEntity
是負責與該節點通訊的埠或進程識別符。更具體來說,對於透過 TCP/IP 連線的節點(正常情況),ControllingEntity
是用於與特定節點通訊的 socket。
系統資訊
傳回目前系統(模擬器)的各種資訊,由 Item
指定
c_compiler_used
- 傳回一個雙元組,描述編譯執行時系統時使用的 C 編譯器。第一個元素是一個原子,描述編譯器的名稱,如果未知則為undefined
。第二個元素是一個項,描述編譯器的版本,如果未知則為undefined
。check_io
- 傳回一個列表,其中包含關於模擬器內部 I/O 檢查的雜項資訊。請注意,返回列表的內容可能因平台和時間而異。僅保證返回一個列表。compat_rel
- 以整數形式傳回本機節點的相容性模式。傳回的整數表示當前模擬器已設定為向後相容的 Erlang/OTP 版本。相容性模式可以在啟動時使用erl(1)
中的命令列標誌+R
來設定。debug_compiled
- 如果模擬器已進行除錯編譯,則傳回true
,否則傳回false
。driver_version
- 傳回一個字串,其中包含執行時系統使用的 Erlang 驅動程式版本。它的格式為 "<主要版本>.<次要版本>"。dynamic_trace
- 傳回一個原子,描述編譯到虛擬機器中的動態追蹤框架。它可以是dtrace
、systemtap
或none
。對於商業或標準版本,它始終為none
。其他傳回值表示自訂組態(例如,./configure --with-dynamic-trace=dtrace
)。有關動態追蹤的更多資訊,請參閱dyntrace(3)
手冊頁和 Erlang 原始碼頂層目錄中的README.dtrace
/README.systemtap
檔案。自:OTP R15B01
dynamic_trace_probes
- 傳回一個t:boolean()
,指示動態追蹤探針(dtrace
或systemtap
)是否內建於模擬器中。只有當虛擬機器是為動態追蹤而建置時,此值才能為true
(也就是說,system_info(dynamic_trace)
傳回dtrace
或systemtap
)。自:OTP R15B01
emu_flavor
- 傳回一個原子,描述執行時系統的風味。這將是emu
或jit
。可能的傳回值可以隨時新增或移除,恕不另行通知。自:OTP 24.0
emu_type
- 傳回一個原子,描述執行時系統的建置類型。這通常是最佳化版本的原子opt
。其他可能的傳回值為debug
、gcov
、valgrind
、gprof
和lcnt
。可能的傳回值可以隨時新增或移除,恕不另行通知。自:OTP 24.0
halt_flush_timeout
- 傳回由erl
+zhft <Timeout>
命令列標誌設定的預設中止刷新逾時。自:OTP 27.0 起
info
- 傳回一個二進制資料,其中包含格式化為 Erlang 崩潰傾印的雜項系統資訊字串。更多資訊,請參閱使用者指南中的 如何解讀 Erlang 崩潰傾印 章節。kernel_poll
- 如果模擬器使用某種核心輪詢實作,則傳回true
,否則傳回false
。loaded
- 傳回一個二進制資料,其中包含格式化為 Erlang 崩潰傾印的已載入模組資訊字串。更多資訊,請參閱使用者指南中的 如何解讀 Erlang 崩潰傾印 章節。machine
- 傳回一個字串,其中包含 Erlang 機器名稱。modified_timing_level
- 如果啟用修改的時間設定,則傳回修改的時間級別(t:integer()
),否則傳回undefined
。有關修改的時間設定的更多資訊,請參閱erl(1)
中的命令列標誌+T
。nif_version
- 傳回一個字串,其中包含執行時系統使用的 Erlang NIF 介面版本。它的格式為 "<主要版本>.<次要版本>"。自:OTP 17.4
otp_release
- 傳回一個字串,其中包含目前執行的 ERTS 應用程式所屬的 OTP 發行版本號碼。從 Erlang/OTP 17 開始,OTP 發行版本號碼對應於主要的 OTP 版本號碼。沒有任何
erlang:system_info()
引數可以提供確切的 OTP 版本。這是因為在一般情況下很難確定確切的 OTP 版本。更多資訊,請參閱系統文件中 系統原則 中的版本說明。outstanding_system_requests_limit
- 傳回由協調全系統變更的系統進程所發出的未完成請求的數量限制。更多資訊,請參閱erlang:system_flag(outstanding_system_requests_limit, Limit)
。自:OTP 24.2
port_parallelism
- 傳回使用的預設埠平行排程提示。更多資訊,請參閱erl(1)
中的命令列引數+spp
。自:OTP R16B 起
system_architecture
- 傳回一個字串,其中包含模擬器建置所針對的處理器和作業系統架構。system_logger
- 傳回由erlang:system_flag(system_logger, *)
設定的目前system_logger
。自:OTP 21.3
system_version
- 傳回一個字串,其中包含版本號碼和一些重要屬性,例如排程器的數量。trace_control_word
- 傳回節點追蹤控制字的值。更多資訊,請參閱使用者指南中 Erlang 中的匹配規範 章節中的函數get_tcw
。version
- 傳回一個字串,其中包含模擬器的版本號碼。wordsize
- 與{wordsize, internal}
相同。{wordsize, internal}
- 以整數形式傳回 Erlang 項字組的大小(以位元組為單位),也就是說,在 32 位元架構上傳回 4,在 64 位元架構上傳回 8。{wordsize, external}
- 傳回模擬器的真實字組大小,也就是指標的大小。該值以整數形式給出,單位為位元組。在純 32 位元架構上,傳回 4。在 64 位元架構上,傳回 8。
-spec system_monitor() -> MonSettings when MonSettings :: undefined | {MonitorPid, Options}, MonitorPid :: pid(), Options :: [system_monitor_option()].
返回由 erlang:system_monitor/2
設定的目前系統監控設定,形式為 {MonitorPid, Options}
,如果不存在任何設定,則返回 undefined
。
選項的順序可能與設定的順序不同。
-spec system_monitor(Arg) -> MonSettings when Arg :: undefined | {MonitorPid, Options}, MonSettings :: undefined | {MonitorPid, Options}, MonitorPid :: pid(), Options :: [system_monitor_option()].
使用引數 undefined
呼叫時,將清除所有系統效能監控設定。
使用 {MonitorPid, Options}
作為引數呼叫該函數,與呼叫 erlang:system_monitor(MonitorPid, Options)
相同。
傳回先前的系統監視器設定,如同 erlang:system_monitor/0
一樣。
-spec system_monitor(MonitorPid, Options) -> MonSettings when MonitorPid :: pid(), Options :: [system_monitor_option()], MonSettings :: undefined | {OldMonitorPid, OldOptions}, OldMonitorPid :: pid(), OldOptions :: [system_monitor_option()].
設定系統效能監控選項。MonitorPid
是接收系統監控訊息的本機進程識別碼 (pid)。
第二個引數是監視選項的列表
{long_gc, Time}
- 如果系統中的垃圾回收至少花費Time
毫秒的實際時間,則會將訊息{monitor, GcPid, long_gc, Info}
送到MonitorPid
。GcPid
是被垃圾回收的 pid。Info
是一個由雙元素元組組成的列表,描述垃圾回收的結果。其中一個元組是
{timeout, GcTime}
,其中GcTime
是垃圾回收的時間,以毫秒為單位。其他元組標記有heap_size
、heap_block_size
、stack_size
、mbuf_size
、old_heap_size
和old_heap_block_size
。這些元組的說明請參閱追蹤訊息gc_minor_start
的描述(請參閱trace:process/4
)。可以新增新的元組,而且Info
列表中元組的順序可以隨時更改,恕不另行通知。{long_message_queue, {Disable, Enable}}
- 如果系統中某個行程的訊息佇列長度達到Enable
長度,則會向MonitorPid
所識別的行程傳送long_message_queue
監控訊息。監控訊息的格式為{monitor, Pid, long_message_queue, Long}
,其中Pid
是訊息佇列過長的行程的行程識別符,而Long
將等於true
,表示該行程處於長訊息佇列狀態。在Pid
所識別的行程的訊息佇列長度降至Disable
長度之前,不會再因為該行程傳送其他long_message_queue
監控訊息。當發生這種情況時,將會向MonitorPid
所識別的行程傳送Long
等於false
的long_message_queue
監控訊息,表示該行程不再處於長訊息佇列狀態。因此,如果訊息佇列長度再次達到Enable
長度,則會再次傳送Long
設定為true
的新的long_message_queue
監控訊息。也就是說,當行程進入或離開長訊息佇列狀態時,會傳送long_message_queue
監控訊息,而這些狀態變更是由Enable
和Disable
參數所定義。Enable
長度必須是大于零的整數,而Disable
長度必須是大于或等于零的整數。Disable
長度也必須小于Enable
長度。如果不滿足以上條件,操作將失敗並產生badarg
錯誤例外。建議Disable
長度使用比Enable
長度小得多的值,以避免被long_message_queue
監控訊息淹沒。{long_schedule, Time}
- 如果系統中的行程或埠不間斷地執行至少Time
毫秒(實際時間),則會向MonitorPid
傳送訊息{monitor, PidOrPort, long_schedule, Info}
。PidOrPort
是正在執行的行程或埠。Info
是描述事件的雙元素元組清單。如果是
pid/0
,則會出現元組{timeout, Millis}
、{in, Location}
和{out, Location}
,其中Location
要么是 MFA({Module, Function, Arity}
),描述行程被排入/排出時所在的函式,要么是原子undefined
。如果是
port/0
,則會出現元組{timeout, Millis}
和{port_op,Op}
。Op
是proc_sig
、timeout
、input
、output
、event
或dist_cmd
其中之一,具體取決於正在執行的驅動程式回呼函數。proc_sig
是一種內部操作,永遠不會出現,而其他操作則表示相應的驅動程式回呼函數timeout
、ready_input
、ready_output
、event
和outputv
(當埠用於分散式時)。元組timeout
中的值Millis
表示行程或埠不間斷的執行時間,該值始終等於或高於啟動追蹤時提供的Time
值。未來版本可能會向Info
清單中新增新的元組。清單中元組的順序可以隨時變更,恕不另行通知。這可用於偵測 NIF 或驅動程式執行時間過長的問題。1 毫秒被認為是驅動程式回呼函數或 NIF 的理想最大時間。然而,分時系統通常認為任何小於 100 毫秒的執行時間都是「可能」且相當「正常」的。但是,較長的排程時間可能表示正在進行交換或 NIF/驅動程式行為異常。行為異常的 NIF 和驅動程式可能導致資源利用率不佳和整體系統效能不佳。
{large_heap, Size}
- 如果系統中的垃圾回收導致堆積分配的大小至少為Size
個字,則會向MonitorPid
傳送訊息{monitor, GcPid, large_heap, Info}
。GcPid
和Info
與先前的long_gc
相同,只是不包含標記為timeout
的元組。如果在垃圾回收後,為所有堆積世代分配的所有記憶體區塊的大小總和等於或高於
Size
,則會傳送監控訊息。當行程被
max_heap_size
終止時,它會在垃圾回收完成之前被終止,因此不會傳送大型堆積訊息。busy_port
- 如果系統中的行程因為傳送到忙碌的埠而暫停,則會向MonitorPid
傳送訊息{monitor, SusPid, busy_port, Port}
。SusPid
是在傳送到Port
時暫停的 pid。busy_dist_port
如果系統中的行程因為傳送到遠端節點上的行程,而該行程的節點間通訊由忙碌的埠處理,則會向MonitorPid
傳送訊息{monitor, SusPid, busy_dist_port, Port}
。SusPid
是在透過節點間通訊埠Port
傳送時暫停的 pid。
傳回先前的系統監視器設定,如同 erlang:system_monitor/0
一樣。
system_monitor/2
的引數指定節點上應如何完成所有系統監控,而不是如何變更。這表示一次只能有一個行程 (MonitorPid
) 可以是系統監控訊息的接收者。此外,清除特定監控選項的方式是不將其包含在清單 Options
中。但是,如果 MonitorPid
所識別的行程終止,則會清除所有系統監控。
沒有特殊的選項值(如零)來清除選項。某些選項具有未指定的最小值。較低的值將調整為最小值。例如,目前無法使用 {long_gc, 0}
來監控所有垃圾回收。
注意
如果監控行程變得過於龐大,以至於它本身在垃圾回收時開始導致系統監控訊息,則這些訊息會擴大行程訊息佇列,並可能使問題更加嚴重。
保持監控行程整潔,並且不要將系統監控限制設定得太緊。
失敗
badarg
- 如果MonitorPid
不存在。badarg
- 如果MonitorPid
不是本機行程。
-spec system_profile() -> ProfilerSettings when ProfilerSettings :: undefined | {ProfilerPid, Options}, ProfilerPid :: pid() | port(), Options :: [system_profile_option()].
返回由 erlang:system_profile/2
設定的目前系統分析設定,形式為 {ProfilerPid, Options}
,如果沒有任何設定,則返回 undefined
。選項的順序可能與設定時的順序不同。
-spec system_profile(ProfilerPid, Options) -> ProfilerSettings when ProfilerPid :: pid() | port() | undefined, Options :: [system_profile_option()], ProfilerSettings :: undefined | {pid() | port(), [system_profile_option()]}.
設定系統分析器選項。ProfilerPid
是接收分析訊息的本機進程識別碼 (pid) 或埠。接收者會排除在所有分析之外。第二個引數是分析選項的列表。
exclusive
- 如果從行程對埠執行同步呼叫,則在呼叫埠的執行期間,會將呼叫行程視為不可執行。呼叫行程會被通知為inactive
,稍後在埠回呼函數傳回時被通知為active
。monotonic_timestamp
- 分析訊息中的時間戳記使用 Erlang 單調時間。時間戳記 (Ts) 的格式和值與erlang:monotonic_time(nanosecond)
產生的一樣。runnable_procs
- 如果行程被放入或從執行佇列中移除,則會向ProfilerPid
傳送訊息{profile, Pid, State, Mfa, Ts}
。在被搶佔後重新插入執行佇列的執行行程不會觸發此訊息。runnable_ports
- 如果埠被放入或從執行佇列中移除,則會向ProfilerPid
傳送訊息{profile, Port, State, 0, Ts}
。scheduler
- 如果排程器進入睡眠或喚醒狀態,則會向ProfilerPid
傳送訊息{profile, scheduler, Id, State, NoScheds, Ts}
。strict_monotonic_timestamp
- 分析訊息中的時間戳記包含 Erlang 單調時間和單調遞增的整數。時間戳記 (Ts) 的格式和值與{erlang:monotonic_time(nanosecond), erlang:unique_integer([monotonic])}
產生的一樣。timestamp
- 分析訊息中的時間戳記包含與erlang:now()
傳回的格式相同之時間戳記 (Ts)。如果未指定任何時間戳記標誌,這也是預設值。如果已透過trace:process/4
啟用cpu_timestamp
,則當啟用標誌timestamp
時,這也會影響分析訊息中產生的時間戳記。
注意
erlang:system_profile
的行為可能會在未來版本中變更。
時間和計時器
-spec cancel_timer(TimerRef) -> Result when TimerRef :: reference(), Time :: non_neg_integer(), Result :: Time | false.
等同於 erlang:cancel_timer(TimerRef, [])
。
-spec cancel_timer(TimerRef, Options) -> Result | ok when TimerRef :: reference(), Async :: boolean(), Info :: boolean(), Option :: {async, Async} | {info, Info}, Options :: [Option], Time :: non_neg_integer(), Result :: Time | false.
取消由 erlang:start_timer
或 erlang:send_after
建立的計時器。TimerRef
識別計時器,並由建立計時器的 BIF 返回。
Option
選項
{async, Async}
- 非同步取消請求。Async
預設為false
,這會導致同步執行取消。當Async
設定為true
時,取消操作會以非同步方式執行。也就是說,cancel_timer()
會向管理計時器的計時器服務傳送非同步取消請求,然後傳回ok
。{info, Info}
- 請求有關取消Result
的資訊。Info
預設為true
,表示會提供Result
。當Info
設定為false
時,不會提供有關取消結果的任何資訊。- 當
Async
為false
時:如果Info
為true
,則Result
由erlang:cancel_timer()
傳回。否則會傳回ok
。 - 當
Async
為true
時:如果Info
為true
,則當執行取消操作時,會向erlang:cancel_timer()
的呼叫者傳送格式為{cancel_timer, TimerRef, Result}
的訊息,否則不會傳送任何訊息。
- 當
未來可能會新增更多 Option
。
如果 Result
是整數,則表示已取消計時器到期前剩餘的時間(以毫秒為單位)。
如果 Result
為 false
,則表示找不到與 TimerRef
對應的計時器。這可能是因為計時器已過期、已取消,或者因為 TimerRef
從未對應到計時器。即使計時器已過期,它也不會告訴您逾時訊息是否已到達其目的地。
注意
管理計時器的計時器服務可能與呼叫行程正在執行的排程器不在同一個排程器上。如果是這樣,與計時器服務的通訊將比在本地執行時花費更長的時間。如果呼叫行程在關鍵路徑中,並且可以在等待此操作結果時執行其他操作,或者不關心操作結果,則需要使用選項
{async, true}
。如果使用選項{async, false}
,則呼叫行程會封鎖,直到執行完操作。
另請參閱 erlang:send_after/4
、erlang:start_timer/4
和 erlang:read_timer/2
。
-spec convert_time_unit(Time, FromUnit, ToUnit) -> ConvertedTime when Time :: integer(), ConvertedTime :: integer(), FromUnit :: time_unit(), ToUnit :: time_unit().
將時間單位 FromUnit
的 Time
值轉換為對應的時間單位 ToUnit
的 ConvertedTime
值。使用 floor/1
函數將結果四捨五入。
警告
在時間單位之間轉換時,您可能會失去準確度和精確度。為了盡量減少此類損失,請以
native
時間單位收集所有資料,並在最終結果上執行轉換。
-spec date() -> Date when Date :: calendar:date().
以 {Year, Month, Day}
形式返回目前日期。
時區和日光節約時間校正取決於底層作業系統。傳回值基於 作業系統系統時間。
例如
> date().
{1995,2,19}
-spec localtime() -> DateTime when DateTime :: calendar:datetime().
返回目前的本地日期和時間,形式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。
例如
> erlang:localtime().
{{1996,11,6},{14,45,17}}
時區和日光節約時間校正取決於底層作業系統。傳回值基於 作業系統系統時間。
-spec localtime_to_universaltime(Localtime) -> Universaltime when Localtime :: calendar:datetime(), Universaltime :: calendar:datetime().
如果底層作業系統支援,則將本地日期和時間轉換為世界協調時間 (UTC)。否則,不執行轉換並返回 Localtime
。
例如
> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}).
{{1996,11,6},{13,45,17}}
失敗:如果 Localtime
表示無效的日期和時間,則返回 badarg
。
-spec localtime_to_universaltime(Localtime, IsDst) -> Universaltime when Localtime :: calendar:datetime(), Universaltime :: calendar:datetime(), IsDst :: true | false | undefined.
將本地日期和時間轉換為世界協調時間 (UTC),如同 erlang:localtime_to_universaltime/1
,但呼叫者決定是否啟用日光節約時間。
如果 IsDst == true
,則 Localtime
處於日光節約時間期間;如果 IsDst == false
,則不處於日光節約時間期間。如果 IsDst == undefined
,底層作業系統可以猜測,這與呼叫 erlang:localtime_to_universaltime(Localtime)
相同。
範例
> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, true).
{{1996,11,6},{12,45,17}}
> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, false).
{{1996,11,6},{13,45,17}}
> erlang:localtime_to_universaltime({{1996,11,6},{14,45,17}}, undefined).
{{1996,11,6},{13,45,17}}
失敗:如果 Localtime
表示無效的日期和時間,則返回 badarg
。
-spec monotonic_time() -> integer().
以 時間單位 native
形式返回目前的 Erlang 單調時間。這是自某個未指定的時間點以來單調增加的時間。
注意
這是一個單調遞增的時間,但不是一個嚴格單調遞增的時間。也就是說,連續呼叫
erlang:monotonic_time/0
可能會產生相同的結果。不同的執行階段系統實例將使用時間中不同的未指定點作為其 Erlang 單調時鐘的基礎。也就是說,比較來自不同執行階段系統實例的單調時間是毫無意義的。不同的執行階段系統實例也可以將此未指定的時間點放置在相對於執行階段系統啟動的不同位置。它可以放置在未來(啟動時的時間是負值)、過去(啟動時的時間是正值)或執行階段系統啟動時(啟動時的時間為零)。執行階段系統啟動時的單調時間可以透過呼叫
erlang:system_info(start_time)
來擷取。
返回目前的 Erlang 單調時間,並轉換為作為引數傳遞的 Unit
。
與呼叫 erlang:convert_time_unit
(
erlang:monotonic_time()
, native, Unit)
相同,但針對常用的 Unit
進行了最佳化。
-spec read_timer(TimerRef) -> Result when TimerRef :: reference(), Time :: non_neg_integer(), Result :: Time | false.
等同於 erlang:read_timer(TimerRef, [])
。
-spec read_timer(TimerRef, Options) -> Result | ok when TimerRef :: reference(), Async :: boolean(), Option :: {async, Async}, Options :: [Option], Time :: non_neg_integer(), Result :: Time | false.
讀取由 erlang:start_timer
或 erlang:send_after
建立的計時器的狀態。TimerRef
識別計時器,並由建立計時器的 BIF 返回。
選項
:
{async, Async}
- 非同步狀態資訊請求。Async
預設為false
,這會導致作業同步執行。在這種情況下,Result
會由erlang:read_timer
傳回。當Async
為true
時,erlang:read_timer
會向管理計時器的計時器服務傳送非同步狀態資訊請求,然後傳回ok
。當作業處理完成時,會將格式為{read_timer, TimerRef, Result}
的訊息傳送到erlang:read_timer
的呼叫者。
未來可能會加入更多 Option
。
如果 Result
是整數,則表示距離計時器過期剩餘的時間(以毫秒為單位)。
如果 Result
是 false
,則找不到與 TimerRef
對應的計時器。這是因為計時器已過期或已取消,或者因為 TimerRef
從未對應到計時器。即使計時器已過期,它也不會告訴您逾時訊息是否已到達目的地。
注意
管理計時器的計時器服務可以與呼叫程序在其上執行的排程器位於不同的位置。如果是這樣,與計時器服務的通訊將比在本地時花費更長的時間。如果呼叫程序位於關鍵路徑中,並且可以在等待此作業的結果時執行其他操作,則您會想要使用選項
{async, true}
。如果使用選項{async, false}
,則呼叫程序會被封鎖,直到作業執行完成。
另請參閱 erlang:send_after/4
、erlang:start_timer/4
和 erlang:cancel_timer/2
。
-spec send_after(Time, Dest, Msg) -> TimerRef when Time :: non_neg_integer(), Dest :: pid() | atom(), Msg :: term(), TimerRef :: reference().
等同於 erlang:send_after(Time, Dest, Msg, [])
。
-spec send_after(Time, Dest, Msg, Options) -> TimerRef when Time :: integer(), Dest :: pid() | atom(), Msg :: term(), Options :: [Option], Abs :: boolean(), Option :: {abs, Abs}, TimerRef :: reference().
啟動計時器。當計時器過期時,訊息 Msg
會傳送到由 Dest
識別的進程。除了逾時訊息的格式外,此函數的工作方式與 erlang:start_timer/4
完全相同。
-spec start_timer(Time, Dest, Msg) -> TimerRef when Time :: non_neg_integer(), Dest :: pid() | atom(), Msg :: term(), TimerRef :: reference().
等同於 erlang:start_timer(Time, Dest, Msg, [])
。
-spec start_timer(Time, Dest, Msg, Options) -> TimerRef when Time :: integer(), Dest :: pid() | atom(), Msg :: term(), Options :: [Option], Abs :: boolean(), Option :: {abs, Abs}, TimerRef :: reference().
啟動計時器。當計時器過期時,訊息 {timeout, TimerRef, Msg}
會傳送到由 Dest
識別的進程。
Option
選項
{abs, false}
- 這是預設值。這表示Time
值會被解釋為相對於目前Erlang 單調時間的時間(以毫秒為單位)。{abs, true}
- 絕對Time
值。Time
值會被解釋為以毫秒為單位的絕對 Erlang 單調時間。
未來可能會加入更多 Option
。
設定計時器過期的絕對時間點必須在區間 [
erlang:convert_time_unit(
erlang:system_info(start_time), native, millisecond),
erlang:convert_time_unit(
erlang:system_info(end_time), native, millisecond) ]
中。如果指定相對時間,則不允許 Time
值為負數。
如果 Dest
是 pid/0
,則它必須是目前執行階段系統實例上建立的程序的 pid/0
。此程序已終止或尚未終止。如果 Dest
是 atom/0
,則會將其解釋為本地註冊程序的名稱。計時器過期時會查詢名稱所指的程序。如果名稱未指到任何程序,則不會傳回錯誤。
如果 Dest
是 pid/0
,則如果 pid/0
所指的程序沒有在執行,或如果該程序結束,則會自動取消計時器。此功能是在 ERTS 5.4.11 中引入的。請注意,當 Dest
是 atom/0
時,計時器不會自動取消。
另請參閱 erlang:send_after/4
、erlang:cancel_timer/2
和 erlang:read_timer/2
。
如需有關 Erlang 中計時器的更多資訊,請參閱 Erlang 中的時間和時間校正 ERTS 使用者指南的 計時器 章節。
失敗:如果引數不符合此處指定的規定,則返回 badarg
。
-spec system_time() -> integer().
以 時間單位 native
形式返回目前的 Erlang 系統時間。
呼叫 erlang:system_time()
等效於 erlang:monotonic_time()
+
erlang:time_offset()
。
注意
在一般情況下,此時間不是單調遞增的時間。如需更多資訊,請參閱使用者指南中時間扭曲模式的文件。
返回目前的 Erlang 系統時間,並轉換為作為引數傳遞的 Unit
。
呼叫 erlang:system_time(Unit)
等效於 erlang:convert_time_unit
(
erlang:system_time()
, native, Unit)
。
注意
在一般情況下,此時間不是單調遞增的時間。如需更多資訊,請參閱使用者指南中時間扭曲模式的文件。
-spec time() -> Time when Time :: calendar:time().
以 {Hour, Minute, Second}
形式返回目前時間。
時區和日光節約時間校正取決於底層作業系統。傳回值基於 作業系統系統時間。
例如
> time().
{9,42,44}
-spec time_offset() -> integer().
以 時間單位 native
形式返回 Erlang 單調時間 和 Erlang 系統時間 之間的目前時間偏移量。目前的 時間偏移量加上 Erlang 單調時間會得出對應的 Erlang 系統時間。
時間偏移量可能會在操作期間變更或不變更,具體取決於所使用的時間扭曲模式。
注意
不同的程序可能會在略微不同的時間點觀察到時間偏移量的變更。
如果執行階段系統處於多時間扭曲模式,則當執行階段系統偵測到作業系統系統時間已變更時,時間偏移量會變更。但是,執行階段系統不會在發生時立即偵測到這一點。檢查時間偏移量的任務會排程為至少每分鐘執行一次;因此,在正常操作下,這會在 1 分鐘內偵測到,但在負載較重時可能會花費更長的時間。
返回 Erlang 單調時間 和 Erlang 系統時間 之間的目前時間偏移量,並轉換為作為引數傳遞的 Unit
。
與呼叫 erlang:convert_time_unit
(
erlang:time_offset()
, native, Unit)
相同,但針對常用的 Unit
進行了最佳化。
-spec timestamp() -> Timestamp when Timestamp :: timestamp().
以 {MegaSecs, Secs, MicroSecs}
格式返回目前的 Erlang 系統時間。
此格式與 os:timestamp/0
和已棄用的 erlang:now/0
使用的格式相同。erlang:timestamp()
存在的原因純粹是為了簡化假設使用此時間戳記格式的現有程式碼的使用。目前 Erlang 系統時間可以使用 erlang:system_time/1
更有效率地以您選擇的時間單位擷取。
erlang:timestamp()
BIF 等同於
timestamp() ->
ErlangSystemTime = erlang:system_time(microsecond),
MegaSecs = ErlangSystemTime div 1000_000_000_000,
Secs = ErlangSystemTime div 1000_000 - MegaSecs*1000_000,
MicroSecs = ErlangSystemTime rem 1000_000,
{MegaSecs, Secs, MicroSecs}.
然而,它使用原生實作,不會在堆積上建立垃圾,並且效能略好。
注意
在一般情況下,此時間不是單調遞增的時間。如需更多資訊,請參閱使用者指南中時間扭曲模式的文件。
-spec universaltime() -> DateTime when DateTime :: calendar:datetime().
如果底層作業系統支援,則根據協調世界時 (UTC) 傳回目前日期和時間,格式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。否則,erlang:universaltime()
等同於 erlang:localtime()
。傳回值基於作業系統系統時間。
例如
> erlang:universaltime().
{{1996,11,6},{14,18,43}}
-spec universaltime_to_localtime(Universaltime) -> Localtime when Localtime :: calendar:datetime(), Universaltime :: calendar:datetime().
如果底層作業系統支援,則將協調世界時 (UTC) 日期和時間轉換為當地日期和時間,格式為 {{Year, Month, Day}, {Hour, Minute, Second}}
。否則,不執行轉換,並傳回 Universaltime
。
例如
> erlang:universaltime_to_localtime({{1996,11,6},{14,18,43}}).
{{1996,11,7},{15,18,43}}
失敗:如果 Universaltime
表示無效的日期和時間,則為 badarg
。
追蹤
-spec trace(PidPortSpec, How, FlagList) -> integer() when PidPortSpec :: pid() | port() | all | processes | ports | existing | existing_processes | existing_ports | new | new_processes | new_ports, How :: boolean(), FlagList :: [trace_flag()].
開啟或關閉靜態舊版追蹤工作階段中程序或埠上的追蹤旗標。
變更
此函式已被在動態追蹤工作階段中運作的
trace:process/4
和trace:port/4
取代。
引數 FlagList
可以包含兩個額外選項
{tracer, Tracer}
- 指定要將追蹤訊息傳送至何處。Tracer
必須是本機處理程序的處理程序識別碼或本機埠的埠識別碼。{tracer, TracerModule, TracerState}
- 指定要呼叫追蹤器模組,而不是傳送追蹤訊息。然後追蹤器模組可以忽略或變更追蹤訊息。有關如何編寫追蹤器模組的更多詳細資訊,請參閱erl_tracer
。
如果未指定 tracer
,則呼叫處理程序會收到所有追蹤訊息。舊版追蹤工作階段沒有指定的追蹤器。
如需進一步的文件,請參閱 trace:process/4
和 trace:port/4
。
呼叫此函式可確保已傳遞所有追蹤訊息。
追蹤訊息的傳遞 (由 erlang:trace/3
、seq_trace
或 erlang:system_profile/2
產生) 在時間軸上與系統中的其他事件錯開。如果您知道 Tracee
已通過其執行中的某些特定點,並且您想要知道至少所有對應於此點之前事件的追蹤訊息何時到達追蹤器,請使用 erlang:trace_delivered(Tracee)
。
當保證所有追蹤訊息都已傳遞到追蹤器,直到呼叫 erlang:trace_delivered(Tracee)
時 Tracee
到達的點時,會將 {trace_delivered, Tracee, Ref}
訊息傳送至 erlang:trace_delivered(Tracee)
的呼叫者。
請注意,訊息 trace_delivered
並非表示追蹤訊息已傳遞。而是表示所有「將被傳遞」的追蹤訊息都已傳遞。如果 Tracee
不是,而且以前也沒有人追蹤,則這不是錯誤,但是如果這種情況,當 trace_delivered
訊息到達時,「沒有」傳遞追蹤訊息。
請注意,Tracee
必須參照目前或先前存在於與 erlang:trace_delivered(Tracee)
的呼叫者所在的同一節點上的處理程序。特殊的 Tracee
原子 all
表示目前在節點中被追蹤的所有處理程序。
當與 追蹤器模組 一起使用時,保證在傳送 trace_delivered
訊息之前,追蹤回呼中傳送的任何訊息都已到達其接收者。
範例:處理程序 A
是 Tracee
,埠 B
是追蹤器,而處理程序 C
是 B
的埠擁有者。C
希望在 A
結束時關閉 B
。為了確保追蹤不會被截斷,C
可以在 A
結束時呼叫 erlang:trace_delivered(A)
,並等待訊息 {trace_delivered, A, Ref}
,然後再關閉 B
。
失敗:如果 Tracee
未參照與 erlang:trace_delivered(Tracee)
的呼叫者所在的同一節點上的處理程序 (已死或存活),則為 badarg
。
-spec trace_info(PidPortFuncEvent, Item) -> Res when PidPortFuncEvent :: pid() | port() | new | new_processes | new_ports | {Module, Function, Arity} | on_load | send | 'receive', Module :: module(), Function :: atom(), Arity :: arity(), Item :: flags | tracer | traced | match_spec | meta | meta_match_spec | call_count | call_time | call_memory | all, Res :: trace_info_return().
傳回靜態舊版追蹤工作階段中關於埠、程序、函式或事件的追蹤資訊。
變更
此函式已被在動態追蹤工作階段中運作的
trace:info/3
取代。
-spec trace_pattern(MFA, MatchSpec) -> non_neg_integer() when MFA :: trace_pattern_mfa() | send | 'receive', MatchSpec :: (MatchSpecList :: trace_match_spec()) | boolean() | restart | pause.
等同於 erlang:trace_pattern(Event, MatchSpec, [])
,為保持回溯相容性而保留。
-spec trace_pattern(send, MatchSpec, []) -> non_neg_integer() when MatchSpec :: (MatchSpecList :: trace_match_spec()) | boolean(); ('receive', MatchSpec, []) -> non_neg_integer() when MatchSpec :: (MatchSpecList :: trace_match_spec()) | boolean(); (MFA, MatchSpec, FlagList) -> non_neg_integer() when MFA :: trace_pattern_mfa(), MatchSpec :: (MatchSpecList :: trace_match_spec()) | boolean() | restart | pause, FlagList :: [trace_pattern_flag()].
在靜態舊版追蹤工作階段中設定呼叫、傳送和接收追蹤的追蹤模式。
變更
此函式已被在動態追蹤工作階段中運作的
trace:function/4
、trace:send/3
和trace:recv/3
取代。
引數 FlagList
可以包含用於呼叫追蹤的兩個額外選項
{meta, Pid} | {meta, TracerModule, TracerState}
- 開啟或關閉所有類型函式呼叫的中繼追蹤。每當呼叫任何指定的函式時,都會將追蹤訊息傳送至追蹤器。如果未指定追蹤器,則會使用self/0
作為預設追蹤器處理程序。
如需進一步的文件,請參閱 trace:function/4
、trace:send/3
和 trace:recv/3
。
已棄用的函式
-spec now() -> Timestamp when Timestamp :: timestamp().
警告
此函式已棄用。請勿使用。
如需更多資訊,請參閱使用者指南中的 時間和時間校正 一節。具體來說,應該和不應該 一節說明了應該使用什麼來取代
erlang:now/0
。
傳回元組 {MegaSecs, Secs, MicroSecs}
,如果基礎作業系統提供,則這是自 1970 年 1 月 1 日 00:00 GMT (零時) 起經過的時間。否則,會選擇其他時間點。還可以保證此 BIF 的以下呼叫會傳回持續增加的值。因此,erlang:now/0
的傳回值可用於產生唯一的時間戳記。如果在快速機器上以緊密迴圈呼叫它,則節點的時間可能會傾斜。
只有在正確設定基礎作業系統的時區資訊時,才能用於檢查當地時間。
-spec phash(Term, Range) -> Hash when Term :: term(), Range :: pos_integer(), Hash :: pos_integer().
警告
此函式已棄用,新程式碼應使用
erlang:phash2/2
。請注意,erlang:phash(X,N)
不一定等於erlang:phash2(X,N)
可移植的雜湊函式,無論機器架構和 ERTS 版本為何,都為相同的 Erlang 詞彙提供相同的雜湊 (BIF 是在 ERTS 4.9.1.1 中引入的)。函式傳回 Term
在 1..Range
範圍內的雜湊值。Range
的最大值為 2^32。