檢視原始碼 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-importedguard-bif

BIF 可能因為各種原因而失敗。如果 BIF 使用了不正確類型的參數呼叫,則所有的 BIF 都會因 badarg 的原因而失敗。其他原因會在每個 BIF 的描述中說明。

摘要

預定義的資料類型

空的 list/0

所有可能的 Erlang 詞彙。與 term/0 同義。

函式或類型的參數數量。

Erlang 的原子

Erlang 的二進制,也就是大小可以被 8 整除的位元字串。

Erlang 的位元字串

以整數表示的資料位元組。

以整數表示的 ASCII 字元或 unicode 碼位。

dynamic 類型,代表靜態未知的類型。

Erlang 的浮點數

Erlang 的 fun

某些實體的唯一識別符,例如程序監視器

Erlang 的整數

包含位元組和/或 iodata 的二進制或列表。

包含位元組和/或 iodata 的列表。

Erlang 的列表,包含任何類型的詞彙。

Erlang 的列表,包含 ContentType 類型的詞彙。

Erlang 的 map,包含任意數量的鍵值關聯。

Erlang 的列表,不保證以 [] 結尾,且列表元素可以是任何類型。

Erlang 的列表,不保證以 [] 結尾,且列表元素為 ContentType 類型。

表示 Module:Function/Arity 函式簽名的三元組。

以原子表示的 Erlang 模組。

負整數。

用於表示函式永遠不會返回值,也就是說它總是會拋出異常的類型。

以原子表示的 Erlang 節點

非負整數,也就是任何正整數或 0。

此類型用於表示函式永遠不會返回值;也就是說它總是會拋出異常。

包含某些資料的 binary/0

包含某些資料的 bitstring/0

包含某些項目的 list/0

包含某些字元的 string/0

Erlang 的數字

Erlang 的程序識別符

Erlang 的埠識別符

大於零的整數。

Erlang 的參考

以 ASCII 字元或 Unicode 碼位列表表示的字元字串。

所有可能的 Erlang 詞彙。與 any/0 同義。

可以傳遞給 接收表達式的逾時值。

Erlang 的元組

類型

目前的 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 校驗和。

透過將先前的校驗和 OldAdlerData 的校驗和組合,繼續計算 adler32 校驗和。

組合兩個先前計算的 adler32 校驗和。

計算並返回 Data 的 crc32(IEEE 802.3 風格)校驗和。

透過將先前的校驗和 OldCrcData 的校驗和組合,繼續計算 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 的狀態。如果 Flagtrue,則開啟監控。如果 Flagfalse,則關閉監控。

行為如同 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 項

傳回一個整數或浮點數,該整數或浮點數是 FloatInt 的算術絕對值。

傳回一個新的元組,該元組比 Tuple1 多一個元素,並且包含 Tuple1 中的元素,後面接著 Term 作為最後一個元素。

傳回對應於 Atom 的文字表示形式的二進位。

傳回對應於 Atom 的文字表示形式的 Unicode 程式碼點清單。

提取由 PosLen 描述的二進位部分。

傳回文字表示形式為 Binary 的原子。如果 Encodingutf8unicode,則二進位必須包含有效的 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/2trace:function/4 時使用的比對規格。

傳回 Term1Term2 中較大的值。如果使用 == 運算子比較時,term 相等,則傳回 Term1

傳回 Term1Term2 中較小的值。如果使用 == 運算子比較時,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。範例

產生並傳回一個在目前執行階段系統實例上唯一的整數。此整數是唯一的,因為此 BIF 使用同一組修飾符,在目前的執行階段系統實例上不會多次傳回相同的整數。每個整數值當然可以透過其他方式建構。

Processes and Ports

alias([]) 等效。

建立一個別名,該別名可用於向建立別名的程序傳送訊息。當別名已停用時,使用別名傳送的訊息將會被捨棄。可以使用 unalias/1 來停用別名。

呼叫一個 fun,並將 Args 中的元素當作引數傳遞。

傳回將 Module 中的 Function 套用至 Args 的結果。所套用的函數必須從 Module 匯出。函數的arity 是 Args 的長度。

此實作相依函數會遞增呼叫程序的削減計數器。

如果 MonitorRef 是呼叫程序透過呼叫 monitor/2 取得的參考,則會關閉此監視。如果監視已關閉,則不會發生任何事。

傳回的值是 true,除非 infoOptionList 的一部分。

傳回程序字典並將其刪除。

傳回與 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 的監控請求。

提供選項列表以修改 monitor/2 提供的監控功能。TypeItem 參數的含義與傳遞給 monitor/2 時相同。

運作方式與 error/1 完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。

運作方式與 error/2 完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。

回傳開啟新的 Erlang 埠的結果作為埠識別符。埠可以被視為外部 Erlang 程序。

對埠執行同步呼叫。OperationData 的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此功能。

關閉開啟的埠。大致與 Port ! {self(), close} 相同,但錯誤行為(請參閱下方)、同步,且埠不會{Port, closed} 回覆除外。

向埠傳送資料。與 Port ! {PortOwner, {command, Data}} 相同,但錯誤行為和同步(請參閱下方)除外。

將埠的所有者(已連接的埠)設定為 Pid。大致與 Port ! {Owner, {connect, Pid}} 相同,但以下除外

對埠執行同步控制操作。OperationData 的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此控制功能。

回傳包含有關 Port 的資訊的元組列表,如果埠未開啟,則回傳 undefined

回傳有關 Port 的資訊。

回傳與本機節點上存在的所有埠對應的埠識別符列表。

標準錯誤 上寫入有關本機程序 Pid 的資訊。

將指定的程序旗標設定為指定的值。回傳旗標的先前值。

以與 process_flag/2 相同的方式,為程序 Pid 設定某些旗標。回傳旗標的舊值。 Flag 的有效值僅為 process_flag/2 中允許的值的子集,即 save_calls

回傳包含有關 Pid 所識別的程序的各種資訊的 InfoTuple 列表,如果程序未執行,則回傳 undefined

回傳有關 Pid 所識別的程序的資訊,由 ItemItemList 指定。如果程序未執行,則回傳 undefined

回傳與本機節點上目前存在的所有程序對應的程序識別符列表。

將新的 Key 新增至程序字典,並與值 Val 相關聯,且回傳 undefined。如果 Key 存在,則會刪除舊值並以 Val 取代,且函式會回傳舊值。

引發具有指定類別、原因和呼叫堆疊回溯(*堆疊追蹤*)的例外。

名稱註冊表 中使用程序識別符 (pid) 或埠識別符註冊名稱 RegNameRegName(必須是原子)可以用於傳送運算子 (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 請求。返回請求識別碼 ReqId

放棄先前發出的 spawn 請求。ReqId 對應於先前由目前進程呼叫 spawn_request() 所返回的請求識別碼。也就是說,只有發出請求的進程才能放棄該請求。

暫停由 Suspendee 識別的進程。等同於呼叫 erlang:suspend_process(Suspendee, [])

增加由 Suspendee 識別的進程的暫停計數,如果該進程尚未處於暫停狀態,則將其置於暫停狀態。在進程恢復之前,暫停的進程不會被排程執行。

引發 throw 類別的例外狀況。旨在用於從函數執行非本地返回。

停用呼叫進程先前建立的別名 Alias

移除呼叫進程與另一個進程或由 Id 識別的埠之間的連結。

名稱註冊表中移除與進程識別碼或埠識別碼相關聯的已註冊名稱 RegName

名稱註冊表 返回具有 已註冊名稱 RegName 的進程識別碼或埠識別碼。如果該名稱未註冊,則返回 undefined

嘗試讓具有相同或更高優先順序的其他進程 (如果有的話) 在返回之前有機會執行。無法保證在呼叫和返回 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_timererlang:send_after 建立的計時器。TimerRef 識別計時器,並由建立計時器的 BIF 返回。

將時間單位 FromUnitTime 值轉換為對應的時間單位 ToUnitConvertedTime 值。使用 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_timererlang: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, []),為保持回溯相容性而保留。

在靜態舊版追蹤工作階段中設定呼叫、傳送和接收追蹤的追蹤模式。

已棄用的函式

now() 已棄用

警告

此函式已棄用。請勿使用。

警告

此函式已棄用,新程式碼應使用 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 整除的位元字串。

此類型的連結

bitstring()

檢視原始碼 (預先定義)
-type bitstring() :: <<_:_*1>>.

Erlang 的位元字串

此類型的連結

boolean()

檢視原始碼 (預先定義)
-type boolean() :: true | false.

布林值。

-type byte() :: 0..255.

以整數表示的資料位元組。

-type char() :: 0..1114111.

以整數表示的 ASCII 字元或 unicode 碼位。

此類型的連結

dynamic()

檢視原始碼 (預先定義)
-type dynamic() :: dynamic().

dynamic 類型,代表靜態未知的類型。

-type float() :: float().

Erlang 的浮點數

此類型的連結

function()

檢視原始碼 (預先定義)
-type function() :: fun().

Erlang 的 fun

此類型的連結

identifier()

檢視原始碼 (預先定義)
-type identifier() :: pid() | port() | reference().

某些實體的唯一識別符,例如程序監視器

此類型的連結

integer()

檢視原始碼 (預先定義)
-type integer() :: integer().

Erlang 的整數

-type iodata() :: iolist() | binary().

包含位元組和/或 iodata 的二進制或列表。

此資料類型用於表示要使用任何 I/O 模組輸出的資料。例如:file:write/2gen_tcp:send/2

若要將 iodata/0 詞彙轉換為 binary/0,您可以使用 iolist_to_binary/2。若要將 string/0unicode:chardata/0 轉碼為 iodata/0,您可以使用 unicode:characters_to_binary/1

-type iolist() :: maybe_improper_list(byte() | binary() | iolist(), binary() | []).

包含位元組和/或 iodata 的列表。

此資料類型用於表示要使用任何 I/O 模組輸出的資料。例如:file:write/2gen_tcp:send/2

在大多數情況下,您會想要使用 iodata/0 而不是此類型。

-type list() :: [any()].

Erlang 的列表,包含任何類型的詞彙。

此類型的連結

list(ContentType)

檢視原始碼 (預先定義)
-type list(ContentType) :: [ContentType].

Erlang 的列表,包含 ContentType 類型的詞彙。

-type map() :: #{any() => any()}.

Erlang 的 map,包含任意數量的鍵值關聯。

此類型的連結

maybe_improper_list()

檢視原始碼 (預先定義)
-type maybe_improper_list() :: maybe_improper_list(any(), any()).

Erlang 的列表,不保證以 [] 結尾,且列表元素可以是任何類型。

此類型的連結

maybe_improper_list(ContentType, TerminationType)

檢視原始碼 (預先定義)
-type maybe_improper_list(ContentType, TerminationType) ::
          maybe_improper_list(ContentType, TerminationType).

Erlang 的列表,不保證以 [] 結尾,且列表元素為 ContentType 類型。

-type mfa() :: {module(), atom(), arity()}.

表示 Module:Function/Arity 函式簽名的三元組。

-type module() :: atom().

以原子表示的 Erlang 模組。

此類型的連結

neg_integer()

檢視原始碼 (預先定義)
-type neg_integer() :: neg_integer().

負整數。

此類型的連結

no_return()

檢視原始碼 (預先定義)
-type no_return() :: none().

用於表示函式永遠不會返回值,也就是說它總是會拋出異常的類型。

-type node() :: atom().

以原子表示的 Erlang 節點

此類型的連結

non_neg_integer()

檢視原始碼 (預先定義)
-type non_neg_integer() :: non_neg_integer().

非負整數,也就是任何正整數或 0。

-type none() :: none().

此類型用於表示函式永遠不會返回值;也就是說它總是會拋出異常。

在規格中,為了清楚起見,請使用 no_return/0

此類型的連結

nonempty_binary()

檢視原始碼 (預先定義)
-type nonempty_binary() :: <<_:8, _:_*8>>.

包含某些資料的 binary/0

此類型的連結

nonempty_bitstring()

檢視原始碼 (預先定義)
-type nonempty_bitstring() :: <<_:1, _:_*1>>.

包含某些資料的 bitstring/0

此類型的連結

nonempty_improper_list(ContentType, TerminationType)

檢視原始碼 (預先定義)
-type nonempty_improper_list(ContentType, TerminationType) ::
          nonempty_improper_list(ContentType, TerminationType).

包含某些項目的 maybe_improper_list/2

此類型的連結

nonempty_list()

檢視原始碼 (預先定義)
-type nonempty_list() :: [any(), ...].

包含某些項目的 list/0

此類型的連結

nonempty_list(ContentType)

檢視原始碼 (預先定義)
-type nonempty_list(ContentType) :: [ContentType, ...].

包含某些項目的 list(ContentType)

此類型的連結

nonempty_maybe_improper_list()

檢視原始碼 (預先定義)
-type nonempty_maybe_improper_list() :: nonempty_maybe_improper_list(any(), any()).

包含某些項目的 maybe_improper_list/0

此類型的連結

nonempty_maybe_improper_list(ContentType, TerminationType)

檢視原始碼 (預先定義)
-type nonempty_maybe_improper_list(ContentType, TerminationType) ::
          nonempty_maybe_improper_list(ContentType, TerminationType).

包含某些項目的 maybe_improper_list(ContentType, TerminationType)

此類型的連結

nonempty_string()

檢視原始碼 (預先定義)
-type nonempty_string() :: [char(), ...].

包含某些字元的 string/0

-type number() :: integer() | float().

Erlang 的數字

-type pid() :: pid().

Erlang 的程序識別符

-type port() :: port().

Erlang 的埠識別符

此類型的連結

pos_integer()

檢視原始碼 (預定義)
-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 可以是 processornode 的子層級。processor 可以在頂層,或是 node 的子層級。node 可以在頂層,或是 processor 的子層級。也就是說,NUMA 節點可以是處理器內部或處理器外部的。CPU 拓樸可以包含處理器內部和外部 NUMA 節點的混合,只要每個邏輯 CPU 屬於一個 NUMA 節點。快取階層結構不屬於 CpuTopology 類型的一部分,但會在未來版本中加入。其他東西也可能在未來版本中加入 CPU 拓樸。因此,請預期 CpuTopology 類型會變更。

此類型的連結

deprecated_time_unit()

檢視原始碼
-type deprecated_time_unit() :: seconds | milli_seconds | micro_seconds | nano_seconds.

time_unit/0 類型也包含以下已棄用的符號時間單位。

-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.
此類型的連結

garbage_collection_defaults()

檢視原始碼
-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_entry() ::
          {LevelTag :: level_tag(), SubLevel :: sub_level()} |
          {LevelTag :: level_tag(), InfoList :: info_list(), SubLevel :: sub_level()}.
-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

此類型的連結

monitor_port_identifier()

檢視原始碼
-type monitor_port_identifier() :: port() | registered_name().
此類型的連結

monitor_process_identifier()

檢視原始碼
-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.
此類型的連結

process_info_result_item()

檢視原始碼
-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().
此類型的連結

registered_process_identifier()

檢視原始碼
-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 stack_item() ::
          {Module :: module(),
           Function :: atom(),
           Arity :: arity() | (Args :: [term()]),
           Location :: [{file, Filename :: string()} | {line, Line :: pos_integer()}]}.
-type stacktrace() ::
          [{module(), atom(), arity() | [term()], [stacktrace_extrainfo()]} |
           {function(), arity() | [term()], [stacktrace_extrainfo()]}].

Erlang 堆疊追蹤,如 Erlang 參考手冊的錯誤和錯誤處理章節中所述。

此類型的連結

stacktrace_extrainfo()

檢視原始碼
-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()}).
此類型的連結

system_monitor_option()

檢視原始碼
-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()}.
此類型的連結

system_profile_option()

檢視原始碼
-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.
此類型的連結

trace_info_item_result()

檢視原始碼
-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()]}].
-type trace_pattern_flag() ::
          global | local | meta |
          {meta, Pid :: pid()} |
          {meta, TracerModule :: module(), TracerState :: term()} |
          call_count | call_time | call_memory.
-type trace_pattern_mfa() :: {atom(), atom(), arity() | '_'} | on_load.

檢查總和

-spec adler32(Data) -> non_neg_integer() when Data :: iodata().

計算並返回 Data 的 adler32 校驗和。

連結到此函數

adler32(OldAdler, Data)

檢視原始碼
-spec adler32(OldAdler, Data) -> non_neg_integer() when OldAdler :: non_neg_integer(), Data :: iodata().

透過將先前的校驗和 OldAdlerData 的校驗和組合,繼續計算 adler32 校驗和。

以下程式碼

X = erlang:adler32(Data1),
Y = erlang:adler32(X,Data2).

將相同的值指派給 Y,如下所示

Y = erlang:adler32([Data1,Data2]).
連結到此函數

adler32_combine(FirstAdler, SecondAdler, SecondSize)

檢視原始碼
-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().

透過將先前的校驗和 OldCrcData 的校驗和組合,繼續計算 crc32 校驗和。

以下程式碼

X = erlang:crc32(Data1),
Y = erlang:crc32(X,Data2).

將相同的值指派給 Y,如下所示

Y = erlang:crc32([Data1,Data2]).
連結到此函數

crc32_combine(FirstCrc, SecondCrc, SecondSize)

檢視原始碼
-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)).
-spec md5(Data) -> Digest when Data :: iodata(), Digest :: binary().

Data 計算 MD5 消息摘要,其中摘要的長度為 128 位元(16 個位元組)。Data 是二進制或小整數和二進制列表。

如需有關 MD5 的詳細資訊,請參閱 RFC 1321 - The MD5 Message-Digest Algorithm

警告

MD5 訊息摘要演算法在程式碼簽署或軟體完整性用途方面並被視為安全。

-spec md5_final(Context) -> Digest when Context :: binary(), Digest :: binary().

完成 MD5 Context 的更新,並返回計算的 MD5 消息摘要。

-spec md5_init() -> Context when Context :: binary().

建立 MD5 內容,用於後續的 md5_update/2 呼叫。

連結到此函數

md5_update(Context, Data)

檢視原始碼
-spec md5_update(Context, Data) -> NewContext
                    when Context :: binary(), Data :: iodata(), NewContext :: binary().

使用 Data 更新 MD5 Context,並返回 NewContext

程式碼

連結到此函數

check_old_code(Module)

檢視原始碼 (自動匯入) (自 OTP R14B04 起)
-spec check_old_code(Module) -> boolean() when Module :: module().

如果 Module舊程式碼,則返回 true,否則返回 false

另請參閱 code

連結到此函數

check_process_code(Pid, Module)

檢視原始碼 (自動匯入)
-spec check_process_code(Pid, Module) -> CheckResult
                            when Pid :: pid(), Module :: module(), CheckResult :: boolean().

等同於 check_process_code(Pid, Module, [])

連結到此函數

check_process_code(Pid, Module, OptionList)

檢視原始碼 (自動匯入) (自 OTP 17.0 起)
-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 是一個無效的選項列表。

連結到此函數

delete_module(Module)

查看原始碼 (自動導入)
-spec delete_module(Module) -> true | undefined when Module :: module().

使 Module 的當前程式碼成為舊程式碼,並從匯出表中刪除此模組的所有參考。如果模組不存在,則返回 undefined,否則返回 true

警告

這個 BIF 是為程式碼伺服器 (請參閱 code) 而設計的,不應在其他地方使用。

失敗: 如果 Module 已經存在舊版本,則為 badarg

連結到此函數

function_exported(Module, Function, Arity)

檢視原始碼
-spec function_exported(Module, Function, Arity) -> boolean()
                           when Module :: module(), Function :: atom(), Arity :: arity().

如果模組 Module當前,並且包含一個匯出的函式 Function/Arity,則返回 true;或者如果存在具有指定名稱的 BIF(以 C 實作的內建函式),則返回 true,否則返回 false

連結到此函數

is_builtin(Module, Function, Arity)

檢視原始碼
-spec is_builtin(Module, Function, Arity) -> boolean()
                    when Module :: module(), Function :: atom(), Arity :: arity().

這個 BIF 對於建立交叉參考工具很有用。

如果 Module:Function/Arity 是一個以 C 實作的 BIF,則返回 true,否則返回 false

連結到此函數

load_module(Module, Binary)

查看原始碼 (自動導入)
-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) 而設計的,不應在其他地方使用。

連結到此函數

load_nif(Path, LoadInfo)

檢視原始碼
-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_loaded(Module)

查看原始碼 (自動導入)
-spec module_loaded(Module) -> boolean() when Module :: module().

如果模組 Module當前程式碼載入,則返回 true;否則返回 false。它不會嘗試載入模組。

連結到此函數

pre_loaded()

查看原始碼 (自動導入)
-spec pre_loaded() -> [module()].

傳回執行時系統中預先載入的 Erlang 模組清單。

預先載入的模組是 Erlang 模組,這些模組是從磁碟載入第一個 Erlang 模組或使用 erl_boot_server 來啟動系統所需的。

連結到此函數

purge_module(Module)

查看原始碼 (自動導入)
-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

連結到此函數

disconnect_node(Node)

查看原始碼 (自動導入)
-spec disconnect_node(Node) -> boolean() | ignored when Node :: node().

強制斷開節點的連線。

這樣做會使節點 Node 看起來像是本機節點已崩潰。這個 BIF 主要用於 Erlang 網路驗證協定。

如果中斷連線成功,則返回 true,否則返回 false。如果本機節點未處於活動狀態,則返回 ignored

注意

此函式可能會在傳遞 nodedown 訊息之前返回。

連結到此函數

dist_ctrl_get_data(DHandle)

查看原始碼 (自 OTP 21.0 起)
-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 分發的替代載體 ➜ 分發模組的文件中找到。

連結到此函數

dist_ctrl_get_data_notification(DHandle)

查看原始碼 (自 OTP 21.0 起)
-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 分發的替代載體 ➜ 分發模組的文件中找到。

連結到此函數

dist_ctrl_get_opt(DHandle, Opt)

查看原始碼 (自 OTP 22.0 起)
-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 分發的替代載體 ➜ 分發模組的文件中找到。

連結到此函數

dist_ctrl_input_handler(DHandle, InputHandler)

查看原始碼 (自 OTP 21.0 起)
-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 分發的替代載體 ➜ 分發模組的文件中找到。

連結到此函數

dist_ctrl_put_data(DHandle, Data)

查看原始碼 (自 OTP 21.0 起)
-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 分發的替代載體 ➜ 分發模組的文件中找到。

連結到此函數

dist_ctrl_set_opt(DHandle, Opt, Val)

檢視原始碼 (自 OTP 22.0 起)
-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 以便在通道上傳遞,以及 DataSize (以位元組為單位)。這會以 {Size, Data} 形式的元組傳回。

當通道關閉時,所有選項都會設定為預設值。

注意

只有註冊為由 DHandle 識別的分發通道的分發控制器的程序才允許呼叫此函式。

此函式用於使用程序作為分發控制器來實作替代分發載體。DHandle 是透過回呼 f_handshake_complete 檢索的。更多資訊可以在 ERTS 使用者指南 ➜ 如何實作 Erlang 分發的替代載體 ➜ 分發模組的文件中找到。

-spec get_cookie() -> Cookie | nocookie when Cookie :: atom().

如果本機節點處於活動狀態,則傳回本機節點的魔術 Cookie,否則傳回原子 nocookie。此值由 set_cookie/1 設定。

連結到此函數

get_cookie(Node)

檢視原始碼 (自 OTP 24.1 起)
-spec get_cookie(Node) -> Cookie | nocookie when Node :: node(), Cookie :: atom().

如果本機節點處於活動狀態,則傳回節點 Node 的魔術 Cookie,否則傳回原子 nocookie。此值由 set_cookie/2 設定。

連結到此函數

is_alive()

檢視原始碼 (自動匯入)
-spec is_alive() -> boolean().

如果本機節點處於活動狀態(也就是說,如果節點可以成為分散式系統的一部分),則返回 true,否則返回 false。如果節點是以

  1. "erl -name LONGNAME" 或,
  2. "erl -sname SHORTNAME".

如果節點已透過呼叫 net_kernel:start/2 取得名稱,且尚未透過呼叫 net_kernel:stop/0 停止,則該節點也可以是活動的。

連結到此函數

monitor_node(Node, Flag)

檢視原始碼 (自動匯入)
-spec monitor_node(Node, Flag) -> true when Node :: node(), Flag :: boolean().

監控節點 Node 的狀態。如果 Flagtrue,則開啟監控。如果 Flagfalse,則關閉監控。

對同一個 Node 多次呼叫 monitor_node(Node, true) 並非錯誤;這會產生許多獨立的監控執行個體。

如果 Node 失敗或不存在,訊息 {nodedown, Node} 會傳遞至程序。如果程序對 monitor_node(Node, true) 進行了兩次呼叫,且 Node 終止,則會將兩個 nodedown 訊息傳遞至該程序。如果沒有與 Node 的連線,則會嘗試建立連線。如果失敗,則會傳遞 nodedown 訊息。

nodedown 訊號的傳遞順序與來自關閉節點的其他連結或監控訊號無關。如果您需要保證在傳送 nodedown 訊號之前,已傳遞來自遠端節點的所有訊號,您應該使用 net_kernel:monitor_nodes/1

透過隱藏連線連線的節點可以像任何其他節點一樣受到監控。

失敗:如果本機節點未活動,則為 notalive

連結到此函數

monitor_node(Node, Flag, Options)

檢視原始碼
-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

連結到此函數

node()

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec node() -> Node when Node :: node().

傳回本機節點的名稱。如果節點未處於活動狀態,則改為傳回 nonode@nohost

-spec nodes() -> Nodes when Nodes :: [node()].

傳回透過正常連線連線至此節點的所有節點清單(也就是說,不會列出隱藏節點)。與 nodes(visible) 相同。

連結到此函數

nodes(Arg)

檢視原始碼 (自動匯入)
-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)

連結到此函數

nodes(Arg, InfoOpts)

檢視原始碼 (自動匯入) (自 OTP 25.1 起)
-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。目前,存在以下節點類型

    • visible - 節點透過一般可見連線連線到呼叫程序的節點。也就是說,節點名稱會出現在 nodes/0 傳回的結果中。

    • hidden - 節點透過隱藏連線連線到呼叫程序的節點。也就是說,節點名稱不會出現在 nodes/0 傳回的結果中。

    • this - 這是呼叫程序的節點。

    • known - 節點未連線,但呼叫程序的節點已知。

範例

(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>
連結到此函數

set_cookie(Cookie)

檢視原始碼 (自 OTP 24.1 起)
-spec set_cookie(Cookie) -> true when Cookie :: atom().

將本機節點的魔術 Cookie 設定為原子 Cookie,該原子也是所有沒有使用 set_cookie/2 設定明確 Cookie 的節點的 Cookie Cookie

如需更多資訊,請參閱系統文件中 Erlang 參考手冊中的「分散式 Erlang」章節。

您可以使用 get_cookie/0 取得此值。

失敗:如果本機節點未活動,則為 function_clause

連結到此函數

set_cookie(Node, Cookie)

檢視原始碼
-spec set_cookie(Node, Cookie) -> true when Node :: node(), Cookie :: atom().

Node 的魔術 Cookie 設定為原子 Cookie。如果 Node 是本機節點,則該函式會將所有其他節點(沒有使用此函式設定明確 Cookie 的節點)的 Cookie 設定為 Cookie

如需更多資訊,請參閱系統文件中 Erlang 參考手冊中的「分散式 Erlang」章節。

您可以使用 get_cookie/1 取得此值。

失敗:如果本機節點未活動,則為 function_clause

Erlang 術語

連結到此函數

abs(Number)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec abs(Float) -> float() when Float :: float();
         (Int) -> non_neg_integer() when Int :: integer().

傳回一個整數或浮點數,該整數或浮點數是 FloatInt 的算術絕對值。

例如

> abs(-3.33).
3.33
> abs(-3).
3
連結到此函數

append_element(Tuple1, Term)

檢視原始碼
-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}
連結到此函數

atom_to_binary(Atom)

檢視原始碼 (自動匯入) (自 OTP 23.0 起)
-spec atom_to_binary(Atom) -> binary() when Atom :: atom().

等效於 atom_to_binary(Atom, utf8)

連結到此函數

atom_to_binary(Atom, Encoding)

檢視原始碼 (自動導入)
-spec atom_to_binary(Atom, Encoding) -> binary()
                        when Atom :: atom(), Encoding :: latin1 | unicode | utf8.

傳回對應於 Atom 的文字表示形式的二進位。

如果 Encodinglatin1,則文字表示中的每個字元會佔用一個位元組。如果 Encodingutf8unicode,則字元會使用 UTF-8 編碼,其中字元可能需要多個位元組。

變更

從 Erlang/OTP 20 開始,原子 (atom) 可以包含任何 Unicode 字元,並且如果 Atom 的文字表示包含 Unicode 字元 > 255,則 atom_to_binary(Atom, latin1) 可能會失敗。

範例

> atom_to_binary('Erlang', latin1).
<<"Erlang">>
連結到此函數

atom_to_list(Atom)

檢視原始碼 (自動導入)
-spec atom_to_list(Atom) -> string() when Atom :: atom().

傳回對應於 Atom 的文字表示形式的 Unicode 程式碼點清單。

例如

> atom_to_list('Erlang').
"Erlang"
> atom_to_list('你好').
[20320,22909]

關於如何將產生的列表轉換為不同的格式,請參閱 unicode

連結到此函數

binary_part(Subject, PosLen)

檢視原始碼 (自動導入) (允許在保護測試中使用) (自 OTP R14B 起)
-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

連結到此函數

binary_part(Subject, Start, Length)

檢視原始碼 (自動導入) (允許在保護測試中使用) (自 OTP R14B 起)
-spec binary_part(Subject, Start, Length) -> binary()
                     when Subject :: binary(), Start :: non_neg_integer(), Length :: integer().

等效於 binary_part(Subject, {Start, Length})

連結到此函數

binary_to_atom(Binary)

檢視原始碼 (自動導入) (自 OTP 23.0 起)
-spec binary_to_atom(Binary) -> atom() when Binary :: binary().

等效於 binary_to_atom(Binary, utf8)

連結到此函數

binary_to_atom(Binary, Encoding)

檢視原始碼 (自動導入)
-spec binary_to_atom(Binary, Encoding) -> atom()
                        when Binary :: binary(), Encoding :: latin1 | unicode | utf8.

傳回文字表示形式為 Binary 的原子。如果 Encodingutf8unicode,則二進位必須包含有效的 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).
'Ѐ'
連結到此函數

binary_to_existing_atom(Binary)

檢視原始碼 (自動導入) (自 OTP 23.0 起)
-spec binary_to_existing_atom(Binary) -> atom() when Binary :: binary().

等效於 binary_to_existing_atom(Binary, utf8)

連結到此函數

binary_to_existing_atom(Binary, Encoding)

檢視原始碼 (自動導入)
-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_to_float(Binary)

檢視原始碼 (自動導入) (自 OTP R16B 起)
-spec binary_to_float(Binary) -> float() when Binary :: binary().

傳回文字表示形式為 Binary 的浮點數。

例如

> binary_to_float(<<"2.2017764e+0">>).
2.2017764

浮點數的字串格式與 Erlang 浮點數文字的格式相同,但底線符號不允許使用。

失敗:如果 Binary 包含錯誤的浮點數表示法,則會發生 badarg 錯誤。

連結到此函數

binary_to_integer(Binary)

檢視原始碼 (自動導入) (自 OTP R16B 起)
-spec binary_to_integer(Binary) -> integer() when Binary :: binary().

傳回文字表示形式為 Binary 的整數。

例如

> binary_to_integer(<<"123">>).
123

binary_to_integer/1 接受與 list_to_integer/1 相同的字串格式。

失敗:如果 Binary 包含錯誤的整數表示法,則會發生 badarg 錯誤。

連結到此函數

binary_to_integer(Binary, Base)

檢視原始碼 (自動導入) (自 OTP R16B 起)
-spec binary_to_integer(Binary, Base) -> integer() when Binary :: binary(), Base :: 2..36.

傳回以 Base 為底的文字表示形式為 Binary 的整數。

例如

> binary_to_integer(<<"3FF">>, 16).
1023

binary_to_integer/2 接受與 list_to_integer/2 相同的字串格式。

失敗:如果 Binary 包含錯誤的整數表示法,則會發生 badarg 錯誤。

連結到此函數

binary_to_list(Binary)

檢視原始碼 (自動導入)
-spec binary_to_list(Binary) -> [byte()] when Binary :: binary().

傳回對應於 Binary 的位元組的整數清單。

連結到此函數

binary_to_list(Binary, Start, Stop)

檢視原始碼 (自動導入)
-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)。

連結到此函數

binary_to_term(Binary)

檢視原始碼 (自動導入)
-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/1binary_to_term/2

連結到此函數

binary_to_term(Binary, Opts)

檢視原始碼 (自動導入) (自 OTP R13B04 起)
-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/1binary_to_term/1list_to_existing_atom/1

連結到此函數

bit_size(Bitstring)

檢視原始碼 (自動導入) (允許在保護測試中使用)
-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_to_list(Bitstring)

檢視原始碼 (自動導入)
-spec bitstring_to_list(Bitstring) -> [byte() | bitstring()] when Bitstring :: bitstring().

傳回對應於 Bitstring 的位元組的整數清單。

如果二進制資料中的位元數不能被 8 整除,則列表的最後一個元素是一個包含剩餘 1-7 位元的位元字串。

例如

> bitstring_to_list(<<433:16>>).
[1,177]
> bitstring_to_list(<<433:16,3:3>>).
[1,177,<<3:3>>]
連結到此函數

byte_size(Bitstring)

檢視原始碼 (自動導入) (允許在保護測試中使用)
-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
連結到此函數

ceil(Number)

檢視原始碼 (自動導入) (允許在保護測試中使用) (自 OTP 20.0 起)
-spec ceil(Number) -> integer() when Number :: number().

傳回不小於 Number 的最小整數。

例如

> ceil(5.5).
6
連結到此函數

decode_packet(Type, Bin, Options)

檢視原始碼
-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 BER

    • sunrm - Sun 的 RPC 編碼

    • cdr - CORBA (GIOP 1.1)

    • fcgi - Fast CGI

    • tpkt - TPKT 格式 [RFC1006]

  • http | httph | http_bin | httph_bin - 超文本傳輸協定。封包會根據先前描述的 HttpPacket 格式傳回。封包可以是請求、回應、標頭或標頭結束標記。無效的行會以 HttpError 傳回。

    已識別的請求方法和標頭欄位會以原子形式傳回。其他則以字串形式傳回。無法識別的標頭欄位字串會格式化為僅第一個字母和大寫,以及連字號後面的字母,例如 "Sec-Websocket-Key"。標頭欄位名稱也會以字串形式在 UnmodifiedField 中傳回,不經任何轉換或格式化。

    當預期為 HttpRequestHttpResponse 時,協定類型 http 僅用於第一行。後續的呼叫應使用 httph 來取得 HttpHeader,直到傳回 http_eoh 為止,這表示標頭的結束和任何後續訊息主體的開始。

    變體 http_binhttph_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}
連結到此函數

delete_element(Index, Tuple1)

檢視原始碼 (自 OTP R16B 起)
-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 中術語高階表示形式的內部詳細資訊。

連結到此函數

element(N, Tuple)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec element(N, Tuple) -> term() when N :: pos_integer(), Tuple :: tuple().

傳回 Tuple 的第 N 個元素(從 1 開始編號)。

例如

> element(2, {a, b, c}).
b
連結到此函數

external_size(Term)

檢視原始碼 (自 OTP R14B04 起)
-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, [])
連結到此函數

external_size(Term, Options)

檢視原始碼 (自 OTP R14B04 起)
-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

連結到此函數

float(Number)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec float(Number) -> float() when Number :: number().

透過將 Number 轉換為浮點數來傳回浮點數。

例如

> float(55).
55.0

注意

如果在 guard 的最上層使用,它會測試參數是否為浮點數;為了清楚起見,請改用 is_float/1

當在 guard 中的表達式中使用 float/1 時,例如 'float(A) == 4.0',它會如先前所述轉換數字。

連結到此函數

float_to_binary(Float)

檢視原始碼 (自動匯入) (自 OTP R16B 起)
-spec float_to_binary(Float) -> binary() when Float :: float().

等效於 float_to_binary(Float, [{scientific, 20}])

連結到此函數

float_to_binary(Float, Options)

檢視原始碼 (自動匯入) (自 OTP R16B 起)
-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">>
連結到此函數

float_to_list(Float)

檢視原始碼 (自動匯入)
-spec float_to_list(Float) -> string() when Float :: float().

等效於 float_to_list(Float, [{scientific, 20}])

連結到此函數

float_to_list(Float, Options)

檢視原始碼 (自動匯入) (自 OTP R16B 起)
-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"。原因已在浮點數的表示問題中解釋。

連結到此函數

floor(Number)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用) (自 OTP 20.0 起)
-spec floor(Number) -> integer() when Number :: number().

傳回不大於 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。請注意,當建立 fun fun M:F/A 時,甚至不需要載入模組 M
  • 所有其他 fun 都稱為本地 fun。當呼叫本地 fun 時,會呼叫建立 fun 的相同版本的程式碼(即使已載入模組的較新版本)。

對於本地和外部 fun,以下元素始終存在於列表中

  • {type, Type} - Typelocalexternal

  • {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 可以是原子 modulenamearityenvtype 中的任何一個。

對於本地函式(local fun),Item 也可以是原子(atom)indexnew_indexnew_uniquniqpid。對於外部函式(external fun),這些項目的值永遠是原子 undefined

請參閱 erlang:fun_info/1

-spec fun_to_list(Fun) -> String :: string() when Fun :: function().

傳回 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) 結果中名為 moduleindexuniq 的值。

  • 未編譯的程式碼 - 所有從未編譯程式碼中的 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 映射到同一個列表。

連結到此函數

hd(List)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-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

連結到此函數

insert_element(Index, Tuple1, Term)

檢視原始碼 (自 OTP R16B 起)
-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_to_binary(Integer)

檢視原始碼 (自動匯入) (自 OTP R16B 起)
-spec integer_to_binary(Integer) -> binary() when Integer :: integer().

傳回對應於 Integer 的文字表示形式的二進位。

例如

> integer_to_binary(77).
<<"77">>
連結到此函數

integer_to_binary(Integer, Base)

檢視原始碼 (自動匯入) (自 OTP R16B 起)
-spec integer_to_binary(Integer, Base) -> binary() when Integer :: integer(), Base :: 2..36.

傳回對應於以 Base 為底的 Integer 的文字表示形式的二進位。

例如

> integer_to_binary(1023, 16).
<<"3FF">>
連結到此函數

integer_to_list(Integer)

檢視原始碼 (自動匯入)
-spec integer_to_list(Integer) -> string() when Integer :: integer().

傳回一個對應於 Integer 的文字表示形式的字串。

例如

> integer_to_list(77).
"77"
連結到此函數

integer_to_list(Integer, Base)

檢視原始碼 (自動匯入)
-spec integer_to_list(Integer, Base) -> string() when Integer :: integer(), Base :: 2..36.

傳回一個對應於以 Base 為底的 Integer 的文字表示形式的字串。

例如

> integer_to_list(1023, 16).
"3FF"
連結到此函數

iolist_size(Item)

檢視原始碼 (自動匯入)
-spec iolist_size(Item) -> non_neg_integer() when Item :: iolist() | binary().

傳回一個整數,該整數是 iolist_to_binary(Item) 的結果的二進位大小(以位元組為單位)。

例如

> iolist_size([1,2|<<3,4>>]).
4
連結到此函數

iolist_to_binary(IoListOrBinary)

檢視原始碼 (自動匯入)
-spec iolist_to_binary(IoListOrBinary) -> binary() when IoListOrBinary :: iolist() | binary().

傳回一個由 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>>
連結到此函數

iolist_to_iovec(IoListOrBinary)

檢視原始碼 (自 OTP 20.1 起)
-spec iolist_to_iovec(IoListOrBinary) -> iovec() when IoListOrBinary :: iolist() | binary().

傳回一個 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,...>>]
連結到此函數

is_atom(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_atom(Term) -> boolean() when Term :: term().

如果 Term 是原子,則傳回 true,否則傳回 false

連結到此函數

is_binary(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_binary(Term) -> boolean() when Term :: term().

如果 Term 是二進位資料,則傳回 true,否則傳回 false

二進位資料永遠包含完整的位元組數。

連結到此函數

is_bitstring(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_bitstring(Term) -> boolean() when Term :: term().

如果 Term 是位元字串 (包括二進位資料),則傳回 true,否則傳回 false

連結到此函數

is_boolean(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_boolean(Term) -> boolean() when Term :: term().

如果 Term 是原子 true 或原子 false (即布林值),則傳回 true。否則傳回 false

連結到此函數

is_float(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_float(Term) -> boolean() when Term :: term().

如果 Term 是浮點數,則傳回 true,否則傳回 false

連結到此函數

is_function(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_function(Term) -> boolean() when Term :: term().

如果 Term 是 fun,則傳回 true,否則傳回 false

連結到此函數

is_function(Term, Arity)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_function(Term, Arity) -> boolean() when Term :: term(), Arity :: arity().

如果 Term 是一個可以與 Arity 個參數一起套用的 fun,則傳回 true,否則傳回 false

連結到此函數

is_integer(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_integer(Term) -> boolean() when Term :: term().

如果 Term 是整數,則傳回 true,否則傳回 false

連結到此函數

is_list(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_list(Term) -> boolean() when Term :: term().

如果 Term 是包含零個或多個元素的列表,則傳回 true,否則傳回 false

連結到此函數

is_map(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用) (自 OTP 17.0 起)
-spec is_map(Term) -> boolean() when Term :: term().

如果 Term 是 map,則傳回 true,否則傳回 false

連結到此函數

is_map_key(Key, Map)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用) (自 OTP 21.0 起)
-spec is_map_key(Key, Map) -> boolean() when Key :: term(), Map :: map().

如果 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
連結到此函數

is_number(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_number(Term) -> boolean() when Term :: term().

如果 Term 是整數或浮點數,則傳回 true。否則傳回 false

連結到此函數

is_pid(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_pid(Term) -> boolean() when Term :: term().

如果 Term 是程序識別碼,則傳回 true,否則傳回 false

連結到此函數

is_port(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_port(Term) -> boolean() when Term :: term().

如果 Term 是埠識別碼,則傳回 true,否則傳回 false

連結到此函數

is_record(Term, RecordTag)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_record(Term, RecordTag) -> boolean() when Term :: term(), RecordTag :: atom().

如果 Term 是元組,且其第一個元素是 RecordTag,則傳回 true。否則傳回 false

注意

通常,編譯器會特別處理對 is_record/2 的呼叫。它會發出程式碼來驗證 Term 是否為元組、其第一個元素是否為 RecordTag,以及大小是否正確。但是,如果 RecordTag 不是文字原子,則會改為呼叫 BIF is_record/2,並且不會驗證元組的大小。

如果 RecordTag 是文字原子,則允許在 guard 測試中使用。

連結到此函數

is_record(Term, RecordTag, Size)

檢視原始碼 (自動匯入) (允許在 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

連結到此函數

is_reference(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_reference(Term) -> boolean() when Term :: term().

如果 Term 是參考,則傳回 true,否則傳回 false

連結到此函數

is_tuple(Term)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec is_tuple(Term) -> boolean() when Term :: term().

如果 Term 是元組,則傳回 true,否則傳回 false

連結到此函數

length(List)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec length(List) -> non_neg_integer() when List :: [term()].

傳回 List 的長度。

例如

> length([1,2,3,4,5,6,7,8,9]).
9
連結到此函數

list_to_atom(String)

檢視原始碼 (自動匯入)
-spec list_to_atom(String) -> atom() when String :: string().

傳回文字表示為 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'
連結到此函數

list_to_binary(IoList)

檢視原始碼 (自動匯入)
-spec list_to_binary(IoList) -> binary() when IoList :: iolist().

傳回一個由 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>>
連結到此函數

list_to_bitstring(BitstringList)

檢視原始碼 (自動匯入)
-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>>
連結到此函數

list_to_existing_atom(String)

檢視原始碼 (自動匯入)
-spec list_to_existing_atom(String) -> atom() when String :: string().

傳回文字表示為 String 的原子,但前提是該原子已存在。如果原子已透過載入程式碼或建立原子屬於其中一部分的 term,由執行階段系統建立,則該原子存在。

失敗:如果不存在文字表示形式為 String 的原子,則會產生 badarg

注意

請注意,編譯器可能會優化掉原子。例如,編譯器會將 atom_to_list(some_atom) 重寫為 "some_atom"。如果該運算式是包含模組中唯一提到原子 some_atom 的地方,則在載入模組時不會建立該原子,且後續對 list_to_existing_atom("some_atom") 的呼叫將會失敗。

連結到此函數

list_to_float(String)

檢視原始碼 (自動匯入)
-spec list_to_float(String) -> float() when String :: string().

傳回文字表示為 String 的浮點數。

例如

> list_to_float("2.2017764e+0").
2.2017764

浮點數的字串格式與 Erlang 浮點數文字的格式相同,但底線符號不允許使用。

失敗:如果 String 包含浮點數的錯誤表示,則會返回 badarg

連結到此函數

list_to_integer(String)

檢視原始碼 (自動匯入)
-spec list_to_integer(String) -> integer() when String :: string().

傳回文字表示為 String 的整數。

例如

> list_to_integer("123").
123
> list_to_integer("-123").
-123
> list_to_integer("+123234982304982309482093833234234").
123234982304982309482093833234234

String 必須包含至少一個數字字符,並且可以有一個可選的前綴,該前綴由單個 "+" 或 "-" 字符組成(也就是說,String 必須匹配正規表示式 "^[+-]?[0-9]+$")。

失敗:如果 String 包含整數的錯誤表示,則會返回 badarg

連結到此函數

list_to_integer(String, Base)

檢視原始碼 (自動匯入)
-spec list_to_integer(String, Base) -> integer() when String :: string(), Base :: 2..36.

傳回以 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

連結到此函數

list_to_pid(String)

檢視原始碼 (自動匯入)
-spec list_to_pid(String) -> pid() when String :: string().

傳回文字表示為 String 的程序識別碼。

例如

> list_to_pid("<0.4.1>").
<0.4.1>

失敗:如果 String 包含行程識別符的錯誤表示,則會返回 badarg

警告

此 BIF 旨在用於除錯,不應在應用程式中使用。

連結到此函數

list_to_port(String)

檢視原始碼 (自動匯入) (自 OTP 20.0 起)
-spec list_to_port(String) -> port() when String :: string().

傳回文字表示為 String 的埠識別碼。

例如

> list_to_port("#Port<0.4>").
#Port<0.4>

失敗:如果 String 包含端口識別符的錯誤表示,則會返回 badarg

警告

此 BIF 旨在用於除錯,不應在應用程式中使用。

連結到此函數

list_to_ref(String)

檢視原始碼 (自動匯入) (自 OTP 20.0 起)
-spec list_to_ref(String) -> reference() when String :: string().

傳回文字表示為 String 的參考。

例如

> list_to_ref("#Ref<0.4192537678.4073193475.71181>").
#Ref<0.4192537678.4073193475.71181>

失敗:如果 String 包含參照的錯誤表示,則會返回 badarg

警告

此 BIF 旨在用於除錯,不應在應用程式中使用。

連結到此函數

list_to_tuple(List)

檢視原始碼 (自動匯入)
-spec list_to_tuple(List) -> tuple() when List :: [term()].

傳回對應於 List 的元組,例如

> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}

List 可以包含任何 Erlang 項。

連結到此函數

make_ref()

檢視原始碼 (自動匯入)
-spec make_ref() -> reference().

傳回一個 唯一參考。該參考在已連線的節點之間是唯一的。

警告

在 OTP 23 之前,當一個節點使用相同的節點名稱多次重新啟動時,較新節點上建立的參照可能會被誤認為是在具有相同節點名稱的較舊節點上建立的參照。

連結到此函數

make_tuple(Arity, InitialValue)

檢視原始碼
-spec make_tuple(Arity, InitialValue) -> tuple() when Arity :: arity(), InitialValue :: term().

建立一個具有指定 Arity 的新元組,其中所有元素都是 InitialValue

例如

> erlang:make_tuple(4, []).
{[],[],[],[]}
連結到此函數

make_tuple(Arity, DefaultValue, InitList)

檢視原始碼
-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_get(Key, Map)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用) (自 OTP 21.0 起)
-spec map_get(Key, Map) -> Value when Map :: map(), Key :: any(), Value :: any().

如果 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"
連結到此函數

map_size(Map)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用) (自 OTP 17.0 起)
-spec map_size(Map) -> non_neg_integer() when Map :: map().

傳回一個整數,即 Map 中鍵值對的數量。

例如

> map_size(#{a=>1, b=>2, c=>3}).
3
連結到此函數

match_spec_test(MatchAgainst, MatchSpec, Type)

檢視原始碼 (自 OTP 19.0 起)
-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/2trace:function/4 時使用的比對規格。

此函數會測試比對規格的「語法」正確性,並針對物件執行比對規格。如果比對規格包含錯誤,則會返回元組 {error, Errors},其中 Errors 是自然語言描述,說明比對規格的錯誤之處。

如果 Typetable,則要比對的物件必須是一個元組。然後,此函數會返回 {ok,Result,[],Warnings},其中 Result 是在真正的 ets:select/2 呼叫中會產生的結果,如果比對規格與物件元組不符,則會返回 false

如果 Typetrace,則要比對的物件必須是一個列表。此函數會返回 {ok, Result, Flags, Warnings},其中 Result 是以下其中一項

  • 如果需要發出追蹤訊息,則為 true
  • 如果不需要發出追蹤訊息,則為 false
  • 要附加到追蹤訊息的訊息項

Flags 是一個列表,其中包含要啟用的所有追蹤旗標,目前只有 return_trace

這是一個有用的除錯和測試工具,尤其是在撰寫複雜的比對規格時。

另請參閱 ets:test_ms/2

連結到此函數

max(Term1, Term2)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec max(Term1, Term2) -> Maximum when Term1 :: term(), Term2 :: term(), Maximum :: term().

傳回 Term1Term2 中較大的值。如果使用 == 運算子比較時,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 測試中使用。

連結到此函數

min(Term1, Term2)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec min(Term1, Term2) -> Minimum when Term1 :: term(), Term2 :: term(), Minimum :: term().

傳回 Term1Term2 中較小的值。如果使用 == 運算子比較時,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 測試中使用。

連結到此函數

node(Arg)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec node(Arg) -> Node when Arg :: pid() | port() | reference(), Node :: node().

傳回 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-1phash/2 的範圍不同,後者的範圍為 1..Range

連結到此函數

pid_to_list(Pid)

檢視原始碼 (自動匯入)
-spec pid_to_list(Pid) -> string() when Pid :: pid().

傳回對應於 Pid 文字表示的字串。

例如

> erlang:pid_to_list(self()).
"<0.85.0>"

注意

節點的建立不包含在 Pid 的列表表示中。這表示具有特定名稱的節點在不同的化身中的程序可以獲得相同的列表表示。

連結到此函數

port_to_list(Port)

檢視原始碼 (自動匯入)
-spec port_to_list(Port) -> string() when Port :: port().

傳回對應於埠識別碼 Port 文字表示的字串。

連結到此函數

ref_to_list(Ref)

檢視原始碼 (自動匯入)
-spec ref_to_list(Ref) -> string() when Ref :: reference().

傳回對應於 Ref 文字表示的字串。

警告

此 BIF 旨在用於除錯,不應在應用程式中使用。

連結到此函數

round(Number)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec round(Number) -> integer() when Number :: number().

透過捨入 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,這是最接近的數字,可以完全表示為浮點數值。有關其他資訊,請參閱浮點數的表示

連結到此函數

setelement(Index, Tuple1, Value)

檢視原始碼 (自動匯入)
-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}
連結到此函數

size(Item)

檢視原始碼 (自動匯入) (允許在 guard 測試中使用)
-spec size(Item) -> non_neg_integer() when Item :: tuple() | binary().

傳回元組中的元素數量,或二進位資料或位元字串中的位元組數。

例如

> size({morni, mulle, bwange}).
3
> size(<<11, 22, 33>>).
3

對於位元字串,會傳回整數的位元組數。也就是說,如果位元字串中的位元數無法被 8 整除,則產生的位元組數會向下捨入。

另請參閱 tuple_size/1byte_size/1bit_size/1

連結到此函數

split_binary(Bin, Pos)

檢視原始碼 (自動匯入)
-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
連結到此函數

term_to_binary(Term)

檢視原始碼 (自動匯入)
-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

注意

無法保證此函數會為相同的項傳回相同的編碼表示。

連結到此函數

term_to_binary(Term, Options)

檢視原始碼 (自動匯入)
-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 選項進行編碼時,如果目前的執行階段系統實例的節點名稱和/或建立在編碼和解碼之間發生變化,則本機識別碼(例如 pidsportsreferences)將會不同。這是因為此類識別碼會透過節點名稱和建立來參照特定的節點。

    當啟動或停止發佈時,執行階段系統實例的節點名稱和建立會發生變化。當使用 -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

連結到此函數

term_to_iovec(Term)

檢視原始碼 (自動匯入) (自 OTP 23.0 起)
-spec term_to_iovec(Term) -> ext_iovec() when Term :: term().

根據 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

連結到此函數

term_to_iovec(Term, Options)

檢視原始碼 (自動匯入) (自 OTP 23.0 起)
-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

連結到此函數

tl(List)

檢視原始碼 (自動匯入) (允許在保護測試中使用)
-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

連結到此函數

trunc(Number)

檢視原始碼 (自動匯入) (允許在保護測試中使用)
-spec trunc(Number) -> integer() when Number :: number().

截斷 Number 的小數位數。

例如

> trunc(5.7).
5
> trunc(-5.7).
-5
> trunc(5).
5
> trunc(36028797018963969.0).
36028797018963968

在最後一個範例中,trunc(36028797018963969.0) 的評估結果為 36028797018963968。原因在於數字 36028797018963969.0 無法精確地表示為浮點數值。相反地,浮點字面值表示為 36028797018963968.0,這是最接近可以精確表示為浮點數值的數字。如需更多資訊,請參閱浮點數的表示法

連結到此函數

tuple_size(Tuple)

檢視原始碼 (自動匯入) (允許在保護測試中使用)
-spec tuple_size(Tuple) -> non_neg_integer() when Tuple :: tuple().

傳回一個整數,即 Tuple 中的元素數量。

例如

> tuple_size({morni, mulle, bwange}).
3
連結到此函數

tuple_to_list(Tuple)

檢視原始碼 (自動匯入)
-spec tuple_to_list(Tuple) -> [term()] when Tuple :: tuple().

傳回對應於 Tuple 的列表。Tuple 可以包含任何 Erlang term。範例

> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]
連結到此函數

unique_integer()

檢視原始碼 (自 OTP 18.0 起)
-spec unique_integer() -> integer().

產生並傳回一個在目前執行階段系統實例上唯一的整數。與呼叫 erlang:unique_integer([]) 等效。

連結到此函數

unique_integer(ModifierList)

檢視原始碼 (自 OTP 18.0 起)
-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 不是有效的修飾符。

程序與埠口

連結到此函數

alias()

檢視原始碼 (自動匯入) (自 OTP 24.0 起)
-spec alias() -> Alias when Alias :: reference().

alias([]) 等效。

連結到此函數

alias(Opts)

檢視原始碼 (自動匯入) (自 OTP 24.0 起)
-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 參考手冊》中 程序別名 章節。

連結到此函數

apply(Fun, Args)

檢視原始碼 (自動匯入)
-spec apply(Fun, Args) -> term() when Fun :: function(), Args :: [term()].

呼叫一個 fun,並將 Args 中的元素當作引數傳遞。

如果參數中的元素數量在編譯時已知,則更好的寫法是 Fun(Arg1, Arg2, ... ArgN)

警告

早期,Fun 也可以指定為 {Module, Function},等同於 apply(Module, Function, Args)這種用法已過時,未來版本將停止運作。

連結到此函數

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 的錯誤。

連結到此函數

bump_reductions(Reductions)

檢視原始碼
-spec bump_reductions(Reductions) -> true when Reductions :: pos_integer().

此實作相依函數會遞增呼叫程序的削減計數器。

在 Beam 模擬器中,每次函式和 BIF 呼叫通常會將減少計數器遞增 1。當計數器達到程序的最大減少次數時(在 Erlang/OTP 19.2 及更高版本中為 4000 次減少),會強制執行上下文切換。

警告

此 BIF 可以在未來版本的 Beam 機器中移除,恕不另行通知。它不太可能在其他 Erlang 實作中實作。

連結到此函數

demonitor(MonitorRef)

檢視原始碼 (自動匯入)
-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 是遠端參考。

連結到此函數

demonitor(MonitorRef, OptionList)

檢視原始碼 (自動匯入)
-spec demonitor(MonitorRef, OptionList) -> boolean()
                   when MonitorRef :: reference(), OptionList :: [Option], Option :: flush | info.

傳回的值是 true,除非 infoOptionList 的一部分。

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 相同的失敗。

-spec erase() -> [{Key, Val}] when Key :: term(), Val :: term().

傳回程序字典並將其刪除。

例如

> put(key1, {1, 2, 3}),
put(key2, [a, b, c]),
erase().
[{key1,{1,2,3}},{key2,[a,b,c]}]
連結到此函數

erase(Key)

檢視原始碼 (自動匯入)
-spec erase(Key) -> Val | undefined when Key :: term(), Val :: term().

傳回與 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)

檢視原始碼 (自動匯入)
-spec error(Reason) -> no_return() when Reason :: term().

引發類別為 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}]}]}}
連結到此函數

error(Reason, Args)

檢視原始碼 (自動匯入)
-spec error(Reason, Args) -> no_return() when Reason :: term(), Args :: [term()] | none.

使用原因 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")
連結到此函數

error(Reason, Args, Options)

檢視原始碼 (自動匯入) (自 OTP 24.0 起)
-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 的模組。預設的 functionformat_error。有關如何使用此 Module:Function/2 的更多詳細資訊,請參閱 format_error/2

例外狀況類別 error 的目的是表示發生了意外錯誤(例如,呼叫函式時使用的參數類型不正確)。有關更多資訊,請參閱有關錯誤和錯誤處理的指南。

連結到此函數

exit(Reason)

檢視原始碼 (自動匯入)
-spec exit(Reason) -> no_return() when Reason :: term().

使用退出原因 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 向另一個程序發送此類訊號,則該訊號將無法被捕獲。

連結到此函數

exit(Pid, Reason)

檢視原始碼 (自動匯入)
-spec exit(Pid, Reason) -> true when Pid :: pid() | port(), Reason :: term().

Pid 所識別的程序或埠傳送帶有退出原因 Reason 的退出信號。

如果 Reason 是除了 normalkill 之外的任何詞,且 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/1erlang:exit/2 名稱相似,但提供非常不同的功能。erlang:exit/1 函數應該在目的是停止目前程序時使用,而 erlang:exit/2 應該在目的是向另一個程序發送結束訊號時使用。另請注意,erlang:exit/1 會引發可捕獲的例外,而 erlang:exit/2 不會引發任何例外。

警告

上述描述未涵蓋的唯一情境是,當程序 P 向自身發送原因為 normal 的結束訊號時,即 erlang:exit(self(), normal)。 在此情境中的行為如下:

  • 如果 P捕捉結束訊號,則結束訊號會轉換為訊息 {'EXIT', From, normal},其中 FromP 的程序識別符,並傳送到 P 的訊息佇列。
  • 如果 P 沒有捕捉結束訊號,則 P 將以原因 normal 結束。

請注意,上述行為與程序向另一個程序發送原因為 normal 的結束訊號時不同。 這種行為可以說是奇怪的,但為了向後相容性而保留了這種行為。

注意

有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。

連結到此函數

garbage_collect()

檢視原始碼 (自動匯入)
-spec garbage_collect() -> true.

強制立即對正在執行的程序進行垃圾回收。

除非已注意到(或有充分理由懷疑)自發垃圾收集將太晚發生或根本不會發生,否則不應使用此函數。

警告

不當使用會嚴重降低系統效能。

連結到此函數

garbage_collect(Pid)

檢視原始碼 (自動匯入)
-spec garbage_collect(Pid) -> GCResult when Pid :: pid(), GCResult :: boolean().

等同於 garbage_collect(Pid, [])

連結到此函數

garbage_collect(Pid, OptionList)

檢視原始碼 (自動匯入) (自 OTP 17.0 起)
-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 是一個無效的選項列表。

-spec get() -> [{Key, Val}] when Key :: term(), Val :: term().

將程序字典以 {Key, Val} 元組的列表形式回傳。回傳列表中的項目順序不拘。

例如

> put(key1, merry),
put(key2, lambs),
put(key3, {are, playing}),
get().
[{key1,merry},{key2,lambs},{key3,{are,playing}}]
-spec get(Key) -> Val | undefined when Key :: term(), Val :: term().

回傳程序字典中與 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}
連結到此函數

get_keys()

檢視原始碼 (自動匯入) (自 OTP 18.0 起)
-spec get_keys() -> [Key] when Key :: term().

回傳程序字典中所有鍵的列表。回傳列表中的項目順序不拘。

例如

> put(dog, {animal,1}),
put(cow, {animal,2}),
put(lamb, {animal,3}),
get_keys().
[dog,cow,lamb]
連結到此函數

get_keys(Val)

檢視原始碼 (自動匯入)
-spec get_keys(Val) -> [Key] when Val :: term(), Key :: term().

回傳在程序字典中與值 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]
連結到此函數

group_leader()

檢視原始碼 (自動匯入)
-spec group_leader() -> pid().

回傳評估此函式的程序的群組領導者的程序識別符。

每個程序都是某個程序群組的成員,而所有群組都有一個群組領導者。 來自群組的所有 I/O 都會傳送到群組領導者。 當產生新的程序時,它會取得與產生程序相同的群組領導者。

最初,在系統啟動時,init 既是其自己的群組領導者,也是所有程序的群組領導者。 在系統啟動期間,程序的群組領導者將根據系統的需求而變更。 完成此操作的一些範例包括:

  • 當啟動應用程式時,該應用程式的頂層監管者會將其群組領導者設定為應用程式主控。 如需更多詳細資訊,請參閱 application:start/2
  • 當執行測試時,common_testeunit 都會設定群組領導者,以便擷取來自測試案例的任何 I/O。
  • 互動式 shell 會設定群組領導者以攔截 I/O。
連結到此函數

group_leader(GroupLeader, Pid)

檢視原始碼 (自動匯入)
-spec group_leader(GroupLeader, Pid) -> true when GroupLeader :: pid(), Pid :: pid().

Pid 的群組領導者設定為 GroupLeader。通常,當從某個 shell 啟動的程序要擁有與 init 不同的群組領導者時會使用此設定。

具有監管樹的應用程式很少應該變更群組領導者,因為 OTP 假設其程序的群組領導者是其應用程式主控。

設定群組領導者遵循Erlang 參考手冊程序章節中所述的訊號排序保證。

另請參閱與啟動和停止應用程式相關的 group_leader/0OTP 設計原則

注意

有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。

連結到此函數

hibernate(Module, Function, Args)

檢視原始碼
-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,以確保在程序喚醒時例外處理常式繼續運作。

連結到此函數

is_process_alive(Pid)

檢視原始碼 (自動匯入)
-spec is_process_alive(Pid) -> boolean() when Pid :: pid().

Pid 必須參照本機節點上的程序。

如果程序存在且處於活動狀態,也就是說,沒有退出且尚未退出,則傳回 true。 否則傳回 false

如果程序 P1 呼叫 is_process_alive(P2Pid),保證在呼叫之前,從 P1 送往 P2P2 是識別碼為 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 的文件,以取得更多關於訊號和結束訊號的資訊。

連結到此函數

link(PidOrPort)

檢視原始碼 (自動匯入)
-spec link(PidOrPort) -> true when PidOrPort :: pid() | port().

在呼叫程序與由 PidOrPort 所識別的另一個程序或埠之間建立並啟用連結。

從這裡開始,我們將把被識別的程序或埠稱為連結對象(linkee)。如果連結對象是一個埠,它必須與呼叫者位於同一個節點上。

如果連結的其中一方終止,它將會傳送一個結束訊號給另一方。結束訊號會包含已終止方的結束原因。因連結而觸發結束訊號的其他情況包括:連結對象不存在(noproc 結束原因)以及在不同節點上的連結程序之間的連線遺失或無法建立(noconnection 結束原因)。

可以透過呼叫 unlink/1 來移除現有的連結。有關連結和由於連結產生的結束訊號的更多資訊,請參閱Erlang 參考手冊中的程序章節。

由於歷史原因,當檢查連結對象是否存在不耗費太多資源,且呼叫者沒有截取結束時,link/1 有一個奇怪的半同步行為。如果上述情況為真,且連結對象不存在,link/1 將會引發一個 noproc 錯誤例外。預期的行為應該是 link/1 回傳 true,而呼叫者稍後會收到一個帶有 noproc 結束原因的結束訊號,但遺憾的是,事實並非如此。noproc 例外 不應與帶有 noproc 結束原因的 結束訊號 混淆。目前,當連結對象預期與呼叫程序位於同一個節點時,檢查它是否存在並不耗費太多資源。

連結的設定和啟動是以非同步方式執行。如果連結已存在,或者呼叫者嘗試建立與自身的連結,則不會執行任何操作。有關連結協定的詳細描述,請參閱 ERTS 使用者指南中的分佈協定章節。

注意

有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。

失敗

  • 如果 PidOrPort 沒有識別出程序或節點本機埠,則會返回 badarg
  • 如果連結對象不存在,並且如上所述,檢查它是否存在不耗費太多資源,則會返回 noproc
連結到此函數

monitor(Type, Item)

檢視原始碼 (自動匯入)
-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 可以是以下原子之一:processporttime_offset

processport 監控只會觸發一次,之後便會從監控程序和被監控的實體中移除。當被監控的程序或埠終止、在建立時不存在,或者與它的連線遺失時,監控會被觸發。如果與它的連線遺失,我們不知道它是否仍然存在。當呼叫 demonitor/1 時,監控也會被關閉。

按名稱進行的 processport 監控,只會在監控實例化時將 RegisteredName 解析為 pid/0port/0,之後對名稱註冊的變更不會影響現有的監控。

processport 監控被觸發時,會傳送一個 'DOWN' 訊息,其模式如下

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

在監控訊息中,MonitorRefType 與先前描述的相同,並且

  • Object - 觸發事件的被監控實體。當監控程序或本機埠時,Object 將等於被監控的 pid/0port/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/0Erlang 單調時間Erlang 系統時間之間的變化。與 time_offset Type 結合使用時,只有一個有效的 Item,即原子 clock_service。請注意,原子 clock_service 不是 程序的註冊名稱。在這種情況下,它作為目前執行階段系統實例的執行階段系統內部時鐘服務的識別碼。

    當時間偏移量發生變化時,會觸發監控。這發生在時間偏移值變更時,或者在使用 單時間跳躍模式時,在 時間偏移量最終確定期間從初步變為最終時。當從初步時間偏移量變更為最終時間偏移量時,無論時間偏移值是否變更,監控都會觸發一次。

    如果執行階段系統處於 多時間跳躍模式,則當執行階段系統偵測到 作業系統系統時間已變更時,時間偏移量會變更。然而,執行階段系統不會在發生時立即偵測到這一點。一個檢查時間偏移量的任務將排程至少每分鐘執行一次,因此在正常操作下,這將在一分鐘內被偵測到,但在高負載期間可能需要更長的時間。

    監控在觸發後不會自動移除。也就是說,時間偏移量的重複變更會重複觸發監控。

    當監控被觸發時,會向監控程序傳送一個 'CHANGE' 訊息。'CHANGE' 訊息的模式如下

    {'CHANGE', MonitorRef, Type, Item, NewTimeOffset}

    其中 MonitorRefTypeItem 與上述描述相同,而 NewTimeOffset 是新的時間偏移量。

    當收到 'CHANGE' 訊息時,您保證在呼叫 erlang:time_offset/0 時不會擷取到舊的時間偏移量。請注意,您可以在收到 'CHANGE' 訊息之前,在呼叫 erlang:time_offset/0 時觀察到時間偏移量的變更。

    自 OTP 18.0 起可用。

對相同的 Item 和/或 Type 多次呼叫 monitor/2 並不是錯誤;它會產生多個獨立的監控實例。

監控功能預期會擴展。也就是說,預期未來版本將支援其他 TypeItem

注意

如果或當 monitor/2 被擴展時,將會引入監控訊息中 TagObjectInfo 的其他可能值。

注意

有關分散式訊號的一些重要資訊,請參閱《Erlang 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。

連結到此函數

monitor(Type, Item, Opts)

檢視原始碼 (自動匯入) (自 OTP 24.0 起)
-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 提供的監控功能。TypeItem 參數的含義與傳遞給 monitor/2 時相同。

目前可用的選項

  • {alias, UnaliasOpt} - 返回的監控參考也會成為呼叫程序的別名。也就是說,返回的參考可以用於向呼叫程序傳送訊息。另請參閱 alias/0UnaliasOpt 決定應如何停用別名。

    • 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 系統上執行,但伺服器可以在較舊的系統上執行。

連結到此函數

nif_error(Reason)

檢視原始碼 (自 OTP R14B 起)
-spec nif_error(Reason) -> no_return() when Reason :: term().

運作方式與 error/1 完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。

連結到此函數

nif_error(Reason, Args)

檢視原始碼 (自 OTP R14B 起)
-spec nif_error(Reason, Args) -> no_return() when Reason :: term(), Args :: [term()].

運作方式與 error/2 完全相同,但是 Dialyzer 認為此 BIF 會回傳任意項。當用於 NIF 的 Stub 函式以在未載入 NIF 函式庫時產生例外時,Dialyzer 不會產生錯誤警告。

連結到此函數

open_port(PortName, PortSettings)

檢視原始碼 (自動匯入)
-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 檔案名稱模式下執行系統,則在 cdenvargsarg0 中指定的執行檔名稱以及參數會受到 Unicode 檔案名稱轉換的影響。為了避免轉換或強制執行,例如 UTF-8,請以正確的編碼將執行檔和/或參數以二進制形式提供。有關詳細資訊,請參閱模組 file、Kernel 中的函數 file:native_name_encoding/0Erlang 中使用 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 應用程式,則不得將不受信任的輸入作為參數傳遞給程式。這會影響 spawnspawn_executable

  • {spawn_executable, FileName} - 與 {spawn, FileName} 的工作方式類似,但僅執行外部執行檔。整個 FileName 都會用作執行檔的名稱,包括任何空格。如果要傳遞參數,可以使用 PortSettings argsarg0

    通常不會調用 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 中的各種伺服器(shelluser)。因此,其使用受到限制。

PortSettings 是埠的設定列表。有效的設定如下:

  • {packet, N} - 訊息前面會加上它們的長度,以 N 個位元組傳送,最高有效位元組優先。 N 的有效值為 1、2 和 4。

  • stream - 輸出訊息在沒有封包長度的情況下傳送。Erlang 程序和外部物件之間必須使用使用者定義的通訊協定。

  • {line, L} - 訊息會按行傳遞。每一行(以作業系統相關的換行符號序列分隔)都會在單一訊息中傳遞。訊息資料格式為 {Flag, Line},其中 Flageolnoeol,而 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/0NameVal 都必須是字串。

    如果 Val 設定為原子 false 或空字串(即 ""[]),則 open_port 將會認為這些變數未設定,如同已呼叫 os:unsetenv/1 一樣。

    有關編碼要求的資訊,請參閱 NameVal 類型的文件。

  • {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,則訊息 eofexit_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_stdoutnouse_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 相同。 LowHigh 的有效值範圍為 [1, (1 bsl (8*erlang:system_info(wordsize)))-2]。如果傳遞原子 disabled,則 Port 永遠不會進入忙碌狀態。

    預設值為 Low = 4096High = 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 相同。 LowHigh 的有效值範圍為 [1, (1 bsl (8*erlang:system_info(wordsize)))-2]。如果傳遞原子 disabled,則 Port 訊息佇列永遠不會進入忙碌狀態。

    請注意,如果驅動程式靜態地停用了此功能,除非此選項也設定為 disable 或根本未傳遞,否則將會引發 badarg 例外狀況失敗。

    預設值為 Low = 4096High = 8192,除非驅動程式本身會修改這些值。

    請注意,如果驅動程式也自行調整這些限制,而且您已停用此功能,則可能會失敗。

    spawn 驅動程式(在產生可執行檔時使用)和 fd 驅動程式不會停用此功能,也不會自行調整這些限制。

    如需更多資訊,請參閱文件 erl_drv_busy_msgq_limits()

所有 Port 類型的預設值為 stream,而產生的 Port 的預設值為 use_stdio

失敗:如果無法開啟 Port,則結束原因是 badargsystem_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

可以透過將命令列標誌 +Q 傳遞給 erl 來設定可以同時開啟的最大 Port 數量。

連結到此函數

port_call(Port, Operation, Data)

檢視原始碼
-spec port_call(Port, Operation, Data) -> term()
                   when Port :: port() | atom(), Operation :: integer(), Data :: term().

對埠執行同步呼叫。OperationData 的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此功能。

Port 是指驅動程式的 Port 識別碼。

Operation 是一個整數,會傳遞給驅動程式。

Data 是任何 Erlang 項。此資料會轉換為二進位項格式,並傳送至 Port。

從驅動程式傳回一個項。傳回資料的意義也取決於 Port 驅動程式。

失敗

  • badarg - 如果 Port 不是開啟 Port 的識別碼,或開啟 Port 的已註冊名稱。如果呼叫程序先前已連結到由 Port 識別的關閉 Port,則保證在發生此 badarg 例外狀況之前傳遞來自 Port 的結束訊號。

  • badarg - 如果 Operation 不適合 32 位元整數。

  • badarg - 如果 Port 驅動程式不支援同步控制操作。

  • badarg - 如果 Port 驅動程式因任何原因決定這樣做(可能是 OperationData 有問題)。

    警告

    請勿使用未知的 Port 識別碼呼叫 port_call 並期望 badarg 例外狀況。根據 Port 驅動程式如何解釋提供的引數,可能會發生任何未定義的行為(包括節點崩潰)。

連結到此函數

port_close(Port)

檢視原始碼 (自動匯入)
-spec port_close(Port) -> true when Port :: port() | atom().

關閉開啟的埠。大致與 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_command(Port, Data)

檢視原始碼 (自動匯入)
-spec port_command(Port, Data) -> true when Port :: port() | atom(), Data :: iodata().

向埠傳送資料。與 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 清單。

警告

不要將資料傳送到未知的埠。任何未定義的行為都是有可能的(包括節點崩潰),具體取決於埠驅動程式如何解譯資料。

連結到此函數

port_command(Port, Data, OptionList)

檢視原始碼 (自動匯入)
-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,但埠的驅動程式不允許強制執行忙碌的埠。

警告

不要將資料傳送到未知的埠。任何未定義的行為都是有可能的(包括節點崩潰),具體取決於埠驅動程式如何解譯資料。

連結到此函數

port_connect(Port, Pid)

檢視原始碼 (自動匯入)
-spec port_connect(Port, Pid) -> true when Port :: port() | atom(), Pid :: pid().

將埠的所有者(已連接的埠)設定為 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 所識別的程序不是現有的本機程序。

連結到此函數

port_control(Port, Operation, Data)

檢視原始碼 (自動匯入)
-spec port_control(Port, Operation, Data) -> iodata() | binary()
                      when Port :: port() | atom(), Operation :: integer(), Data :: iodata().

對埠執行同步控制操作。OperationData 的含義取決於埠,也就是說,取決於埠驅動程式。並非所有埠驅動程式都支援此控制功能。

根據埠驅動程式,會傳回 0..255 範圍內的整數清單,或一個二進制資料。傳回資料的意義也取決於埠驅動程式。

失敗

  • badarg - 如果 Port 不是一個開啟的埠,或一個開啟埠的註冊名稱。

  • badarg - 如果 Operation 無法放入 32 位元的整數中。

  • badarg - 如果 Port 驅動程式不支援同步控制操作。

  • badarg - 如果 Port 驅動程式因任何原因決定這樣做(可能是 OperationData 有問題)。

    警告

    請勿使用未知的 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/2port_command/3Port ! {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()].

回傳與本機節點上存在的所有埠對應的埠識別符列表。

請注意,正在退出的埠存在,但未開啟。

連結到此函數

process_display(Pid, Type)

檢視原始碼
-spec process_display(Pid, Type) -> true when Pid :: pid(), Type :: backtrace.

標準錯誤 上寫入有關本機程序 Pid 的資訊。

原子 Type 的唯一允許值是 backtrace,它顯示呼叫堆疊的內容,包括有關呼叫鏈的資訊,並首先列印目前函式。輸出的格式未進一步定義。

連結到此函數

process_flag(Flag, Value)

檢視原始碼 (自動匯入)
-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 是整數,則會使用 killerror_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_sizeold_heap_block_sizembuf_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 是一個原子。存在四個優先權級別:lownormalhighmax。預設值為 normal

    注意

    優先權級別 max 保留給 Erlang 執行時系統內部使用, 應由其他程式使用。

    在每個優先權級別內部,行程會以循環配置的方式進行排程。

    優先權為 normallow 的行程執行會交錯進行。優先權為 low 的行程被選中執行的頻率低於優先權為 normal 的行程。

    當存在優先權為 high 的可執行行程時,不會選擇執行優先權為 lownormal 的行程。但是請注意,這 表示當優先權為 high 的行程正在執行時,就沒有優先權為 lownormal 的行程可以執行。當使用多個排程器時,可以並行執行的行程數量可能多於優先權為 high 的行程數量。也就是說,一個優先權為 low 的行程和一個優先權為 high 的行程可以同時執行。

    當存在優先權為 max 的可執行行程時,不會選擇執行優先權為 lownormalhigh 的行程。與優先權 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},則不會將函式呼叫儲存到呼叫儲存清單。(呼叫儲存清單不會清除。此外,傳送、接收和逾時事件仍會新增至清單。)

連結到此函數

process_flag(Pid, Flag, Value)

檢視來源 (自動匯入)
-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

連結到此函數

process_info(Pid)

檢視來源 (自動匯入)
-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_nameInfoTuple

有關特定 InfoTuple 的資訊,請參閱 process_info/2

警告

此 BIF 僅適用於除錯。對於所有其他用途,請使用 process_info/2

失敗:如果 Pid 不是本機行程,則為 badarg

連結到此函數

process_info(Pid, ItemSpec)

檢視來源 (自動匯入)
-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 所識別的程序的資訊,由 ItemItemList 指定。如果程序未執行,則回傳 undefined

如果行程處於活動狀態且指定了單個 Item,則傳回的值是對應的 InfoTuple,除非 Item =:= registered_name 且行程沒有已註冊的名稱。在這種情況下,會傳回 []。此奇怪的行為是出於歷史原因,並為了向後相容性而保留。

如果指定了 ItemList,則結果為 InfoTupleListInfoTupleList 中的 InfoTuple 會與 ItemList 中包含的對應 Item 按照相同的順序包含。有效的 Item 可以多次包含在 ItemList 中。

取得行程資訊會遵循Erlang 參考手冊行程章節中所述的訊號排序保證。

注意

如果 registered_nameItemList 的一部分,且行程沒有註冊的名稱,則 {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 是一個元組清單。元組包含:BinaryIdBinarySizeBinaryRefcCount

    根據 message_queue_data 行程旗標的值,訊息佇列可能會儲存在堆積上。

  • {catchlevel, CatchLevel} - CatchLevel 是此行程中目前活動的 catch 數量。此 InfoTuple 可以在沒有事先通知的情況下變更或移除。

  • {current_function, {Module, Function, Arity} | undefined} - ModuleFunctionArity 是行程的目前函式呼叫。如果行程目前正在執行原生編譯程式碼,則可能會傳回值 undefined

  • {current_location, {Module, Function, Arity, Location}} - ModuleFunctionArity 是行程的目前函式呼叫。Location 是一個描述原始程式碼位置的雙元組清單。

  • {current_stacktrace, Stack} - 傳回行程的目前呼叫堆疊回溯追蹤(堆疊追蹤)。堆疊的格式與 trycatch 部分中的格式相同。請參閱呼叫堆疊回溯追蹤(堆疊追蹤)。堆疊追蹤的深度會根據 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}} - ModuleFunctionArity 是程序產生時的初始函數呼叫。

  • {links, PidsAndPorts} - PidsAndPorts 是一個程序識別碼和埠識別碼的列表,其中包含程序連結到的程序或埠。

  • {label, Label} - Label 是程序的標籤。請參閱 proc_lib:get_label/1

    自:OTP 27.2

  • {last_calls, false|Calls} - 如果未啟用程序的呼叫儲存 (請參閱 process_flag/3),則該值為 false。如果已啟用呼叫儲存,則會傳回一個列表,其中最後一個元素是最近呼叫的。

  • {memory, Size} - Size 是程序的大小,以位元組為單位。這包括呼叫堆疊、堆積和內部結構。

  • {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} - MQDmessage_queue_data 程序標誌的目前值,其值可以是 off_heapon_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 (暫停在「忙碌」的埠上,或由 BIF erlang:suspend_process/1,2 暫停)
  • {suspending, SuspendeeList} - SuspendeeList 是一個 {Suspendee, ActiveSuspendCount, OutstandingSuspendCount} 元組的列表。 Suspendee 是已由 Pid 識別的程序,透過 BIF erlang:suspend_process/2erlang:suspend_process/1 暫停,或將要暫停的程序的識別碼。

    ActiveSuspendCountPid 暫停 Suspendee 的次數。OutstandingSuspendCountPid 發送但尚未完成的暫停請求數量,也就是說

    • 如果 ActiveSuspendCount =/= 0,則 Suspendee 目前處於暫停狀態。
    • 如果 OutstandingSuspendCount =/= 0,則已使用 erlang:suspend_process/2asynchronous 選項,且暫停的程序尚未被 Pid 暫停。

    請注意,ActiveSuspendCountOutstandingSuspendCount 並不是 Suspendee 上的總暫停計數,僅是由 Pid 貢獻的部分。

  • {total_heap_size, Size} - Size 是程序所有堆積片段的總大小,以字組為單位。這包括程序堆疊和任何被認為是堆積一部分的未接收訊息。

  • {trace, InternalTraceFlags} - InternalTraceFlags 是一個代表此程序內部追蹤標誌的整數。此 InfoTuple 可以在未事先通知的情況下變更或移除。

  • {trap_exit, Boolean} - 如果程序正在捕獲退出,則 Booleantrue,否則為 false

請注意,並非所有實作方式都支援所有這些 Item

失敗

  • badarg - 如果 Pid 不是本機程序。

  • badarg - 如果 Item 是無效的項目。

連結到此函數

processes()

檢視來源 (自動導入)
-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>]
連結到此函數

put(Key, Val)

檢視來源 (自動導入)
-spec put(Key, Val) -> term() when Key :: term(), Val :: term().

將新的 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 時儲存的值不會被收回。

連結到此函數

raise(Class, Reason, Stacktrace)

檢視原始碼
-spec raise(Class, Reason, Stacktrace) -> badarg
               when Class :: error | exit | throw, Reason :: term(), Stacktrace :: raise_stacktrace().

引發具有指定類別、原因和呼叫堆疊回溯(*堆疊追蹤*)的例外。

Classerrorexitthrow。因此,如果沒有堆疊追蹤,erlang:raise(Class, Reason, Stacktrace) 等效於 erlang:Class(Reason) (前提是 Class 是有效類別)。

Reason 可以是任何項目。

Stacktrace 是 try-catch 子句中提供的列表。

try
    ...
catch Class:Reason:Stacktrace ->
    ...
end

也就是說,四元組 {Module, Function, Arity | Args, ExtraInfo} 的列表,其中 ModuleFunction 是原子,第三個元素是整數 arity 或引數列表。堆疊追蹤也可以包含 {Fun, Args, ExtraInfo} 元組,其中 Fun 是本機函式,而 Args 是引數列表。

結尾的元素 ExtraInfo 是可選的。省略它等同於指定一個空列表。

堆疊追蹤會用作呼叫程序的例外堆疊追蹤;它會被截斷為目前的最大堆疊追蹤深度。

由於評估此函數會導致進程終止,因此除非參數無效,否則它沒有傳回值。如果參數無效,函數會傳回錯誤原因 badarg。如果您想要確定不會返回任何值,您可以呼叫 error(erlang:raise(Class, Reason, Stacktrace)),並希望稍後能區分例外狀況。

關於例外類別以及如何捕獲例外狀況的更多資訊,請參閱關於錯誤和錯誤處理的參考手冊。

連結到此函數

register(RegName, PidOrPort)

檢視原始碼 (自動匯入)
-spec register(RegName, PidOrPort) -> true when RegName :: atom(), PidOrPort :: port() | pid().

名稱註冊表 中使用程序識別符 (pid) 或埠識別符註冊名稱 RegNameRegName(必須是原子)可以用於傳送運算子 (RegName ! Message) 和大多數其他以 pid 或埠識別符作為引數的 BIF 中,以取代 pid 或埠識別符。

例如

> register(db, Pid).
true

註冊名稱被視為直接可見的 Erlang 資源,並且會在進程終止時自動取消註冊。

失敗

  • badarg - 如果 PidOrPort 不是現有的本地進程或埠。

  • badarg - 如果 RegName 已在使用中。

  • badarg - 如果進程或埠已註冊(已有名稱)。

  • badarg - 如果 RegName 是原子 undefined

連結到此函數

registered()

檢視原始碼 (自動匯入)
-spec registered() -> [RegName] when RegName :: atom().

回傳使用 register/2 註冊的名稱列表。

例如

> registered().
[code_server, file_server, init, user, my_db]
連結到此函數

resume_process(Suspendee)

檢視原始碼
-spec resume_process(Suspendee) -> true when Suspendee :: pid().

減少 Suspendee 所識別的程序的暫停計數。

Suspendee 先前必須透過呼叫 erlang:resume_process(Suspendee) 的進程,使用 erlang:suspend_process/2erlang:suspend_process/1 暫停。當 Suspendee 的暫停計數達到零時,Suspendee 會恢復,也就是說,它的狀態會從暫停變更為暫停前的狀態。

警告

此 BIF 僅用於除錯目的。

失敗

  • badarg - 如果 Suspendee 不是進程識別符。

  • badarg - 如果呼叫 erlang:resume_process/1 的進程先前沒有增加由 Suspendee 識別的進程的暫停計數。

  • badarg - 如果由 Suspendee 識別的進程未處於執行狀態。

連結到此函數

self()

檢視原始碼 (自動匯入) (允許在防護測試中使用)
-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 參考手冊》中《程序》章節的 透過分散式封鎖訊號 章節。

連結到此函數

send(Dest, Msg, Options)

檢視原始碼
-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:請極其謹慎地使用。

連結到此函數

send_nosuspend(Dest, Msg)

檢視原始碼
-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 時,預期的行為和採取的動作是特定於應用程式和硬體的。

警告

請極其謹慎地使用。

連結到此函數

send_nosuspend(Dest, Msg, Options)

檢視原始碼
-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 且節點尚未連線時),都保證訊息傳送。

警告

請極其謹慎地使用。

連結到此函數

spawn(Fun)

檢視原始碼 (自動匯入)
-spec spawn(Fun) -> pid() when Fun :: function().

回傳由將 Fun 應用於空列表 [] 所啟動的新程序的程序識別符。否則運作方式與 spawn/3 相同。

連結到此函數

spawn(Node, Fun)

檢視原始碼 (自動匯入)
-spec spawn(Node, Fun) -> pid() when Node :: node(), Fun :: function().

回傳由將 Fun 應用於 Node 上的空列表 [] 所啟動的新程序的程序識別符。如果 Node 不存在,則會回傳無用的 pid。否則運作方式與 spawn/3 相同。

連結到此函數

spawn(Module, Function, Args)

檢視原始碼 (自動匯入)
-spec spawn(Module, Function, Args) -> pid()
               when Module :: module(), Function :: atom(), Args :: [term()].

回傳由將 Module:Function 應用於 Args 所啟動的新程序的程序識別符。

如果 Module:Function/Arity 不存在 (其中 ArityArgs 的長度),則新進程會評估 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>
連結到此函數

spawn(Node, Module, Function, Args)

檢視原始碼 (自動匯入)
-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 相同。

連結到此函數

spawn_link(Fun)

檢視原始碼 (自動匯入)
-spec spawn_link(Fun) -> pid() when Fun :: function().

回傳由將 Fun 應用於空列表 [] 所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3 相同。

連結到此函數

spawn_link(Node, Fun)

檢視原始碼 (自動匯入)
-spec spawn_link(Node, Fun) -> pid() when Node :: node(), Fun :: function().

回傳由將 Fun 應用於 Node 上的空列表 [] 所啟動的新程序的程序識別符 (pid)。會在呼叫程序與新程序之間原子地建立連結。如果 Node 不存在,則會回傳無用的 pid,並向呼叫程序傳送帶有原因 noconnection 的退出信號。否則運作方式與 spawn/3 相同。

連結到此函數

spawn_link(Module, Function, Args)

檢視原始碼 (自動匯入)
-spec spawn_link(Module, Function, Args) -> pid()
                    when Module :: module(), Function :: atom(), Args :: [term()].

回傳由將 Module:Function 應用於 Args 所啟動的新程序的程序識別符。會在呼叫程序與新程序之間原子地建立連結。否則運作方式與 spawn/3 相同。

連結到此函數

spawn_link(Node, Module, Function, Args)

檢視原始碼 (自動匯入)
-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 相同。

連結到此函數

spawn_monitor(Fun)

檢視原始碼 (自動匯入)
-spec spawn_monitor(Fun) -> {pid(), reference()} when Fun :: function().

返回一個新進程的進程識別碼,該進程由將 Fun 應用於空列表 [] 所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3 相同。

連結到此函數

spawn_monitor(Node, Fun)

檢視原始碼 (自動匯入) (自 OTP 23.0 起)
-spec spawn_monitor(Node, Fun) -> {pid(), reference()} when Node :: node(), Fun :: function().

返回一個新進程的進程識別碼,該進程由在節點 Node 上將 Fun 應用於空列表 [] 所啟動,以及一個為新進程建立的監視器參考。否則行為與 spawn/3 相同。

如果由 Node 識別的節點不支援分散式 spawn_monitor(),則呼叫會失敗並產生 notsup 例外狀況。

連結到此函數

spawn_monitor(Module, Function, Args)

檢視原始碼 (自動匯入)
-spec spawn_monitor(Module, Function, Args) -> {pid(), reference()}
                       when Module :: module(), Function :: atom(), Args :: [term()].

透過將 Module:Function 應用於 Args 來啟動一個新進程。同時監控該進程。返回進程識別碼和監視器的參考。否則行為與 spawn/3 相同。

連結到此函數

spawn_monitor(Node, Module, Function, Args)

檢視原始碼 (自動匯入) (自 OTP 23.0 起)
-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 例外狀況。

連結到此函數

spawn_opt(Fun, Options)

檢視原始碼 (自動匯入)
-spec spawn_opt(Fun, Options) -> pid() | {pid(), reference()}
                   when Fun :: function(), Options :: [spawn_opt_option()].

返回一個新進程的進程識別碼 (pid),該進程由將 Fun 應用於空列表 [] 所啟動。否則行為與 spawn_opt/4 相同。

如果指定了 monitor 選項,新建立的程序會被監控,並且會返回 pid 和監控的參考值。

連結到此函數

spawn_opt(Node, Fun, Options)

查看原始碼 (自動導入)
-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 的文件中找到。

連結到此函數

spawn_opt(Module, Function, Args, Options)

查看原始碼 (自動導入)
-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_heapon_heapmessage_queue_data 程序標誌的預設值由 +hmqd 命令列參數在 erl 中決定。有關更多資訊,請參閱 process_flag(message_queue_data, MQD) 的文件。

  • {async_dist, Enabled} - 自:OTP 25.3

    設定已產生程序的 async_dist 程序標誌。此選項將覆蓋由 +pad <boolean> 命令列參數設定的預設值。

連結到此函數

spawn_opt(Node, Module, Function, Args, Options)

查看原始碼 (自動導入)
-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(Fun)

查看原始碼 (自動導入) (自 OTP 23.0 起)
-spec spawn_request(Fun) -> ReqId when Fun :: function(), ReqId :: reference().

等同於呼叫 spawn_request(node(),Fun,[])。也就是說,在本地節點上發出不帶任何選項的 spawn 請求。

連結到此函數

spawn_request(FunOrNode, OptionsOrFun)

查看原始碼 (自動導入) (自 OTP 23.0 起)
-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,[]),具體取決於引數。

也就是

  • 在本機節點上的產生請求。
  • 不帶選項的產生請求。
連結到此函數

spawn_request(NodeOrModule, FunOrFunction, OptionsOrArgs)

查看原始碼 (自動導入) (自 OTP 23.0 起)
-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),具體取決於引數。

也就是

  • 不帶選項的產生請求。
  • 在本機節點上的產生請求。
連結到此函數

spawn_request(Node, Module, Function, Args, Options)

查看原始碼 (自動導入) (自 OTP 23.0 起)
-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

    • yes - 無論操作是否成功,都會將衍生回覆訊息傳送給呼叫者。如果對 spawn_request() 的呼叫在沒有引發例外的情況下返回,並且 reply 選項設定為 yes,則保證會將成功訊息錯誤訊息傳遞給呼叫者。reply 選項預設設定為 yes

    • no - 當衍生操作完成時,不會將衍生回覆訊息傳送給呼叫者。無論操作是否成功皆是如此。

    • error_only - 如果衍生操作成功,則不會將衍生回覆訊息傳送給呼叫者,但如果操作失敗,則會將錯誤訊息傳送給呼叫者。

    • success_only - 如果衍生操作失敗,則不會將衍生回覆訊息傳送給呼叫者,但如果操作成功,則會將成功訊息傳送給呼叫者。

  • {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_request_abandon(ReqId)

檢視來源碼 (自動匯入) (自 OTP 23.0 起)
-spec spawn_request_abandon(ReqId :: reference()) -> boolean().

放棄先前發出的 spawn 請求。ReqId 對應於先前由目前進程呼叫 spawn_request() 所返回的請求識別碼。也就是說,只有發出請求的進程才能放棄該請求。

只有在衍生請求完成之前,才能成功放棄衍生請求。當衍生請求成功放棄後,呼叫者將不會受到衍生請求本身未來直接影響。例如,它不會收到衍生回覆訊息。但是,該請求並未撤回,因此可能會或可能不會由於該請求而建立新程序。如果在放棄衍生請求後建立了新程序,則不會因為衍生請求而為 spawn_request_abandon/1 的呼叫者設定任何監視器或連結。如果衍生請求包含 link 選項,則會從其父程序向由於此請求而建立的程序傳送退出訊號,退出原因為 abandoned,當偵測到衍生操作成功時。

注意

由於已放棄的衍生請求而建立的程序可以像任何其他程序一樣與其父程序進行通訊。*只有*實際衍生請求對父程序的直接影響,才會透過放棄衍生請求而被取消。

傳回值

  • true - 衍生請求已成功放棄。

  • false - 沒有放棄衍生請求。ReqId 請求識別碼不對應於呼叫程序發出的未完成衍生請求。原因可能是

    • ReqId 對應於呼叫程序先前發出的衍生請求。衍生操作已完成,並且已將衍生回覆傳遞給呼叫程序,除非在請求中停用了衍生回覆。
    • ReqId 不對應於呼叫程序發出的衍生請求。

如果 ReqId 不是參考,則此函數會失敗,並發生 badarg 例外。

連結到此函數

suspend_process(Suspendee)

檢視原始碼
-spec suspend_process(Suspendee) -> true when Suspendee :: pid().

暫停由 Suspendee 識別的進程。等同於呼叫 erlang:suspend_process(Suspendee, [])

警告

此 BIF 僅用於除錯目的。

連結到此函數

suspend_process(Suspendee, OptList)

檢視原始碼
-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 的暫停計數會減少。當程序終止時,由程序取得的其他程序上的所有增加的暫停計數都會自動減少。

選項 (Opts)

  • 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(Any)

檢視來源碼 (自動匯入)
-spec throw(Any) -> no_return() when Any :: term().

引發 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

有關更多資訊,請參閱有關錯誤和錯誤處理的指南。

連結到此函數

unalias(Alias)

檢視來源碼 (自動匯入) (自 OTP 24.0 起)
-spec unalias(Alias) -> boolean() when Alias :: reference().

停用呼叫進程先前建立的別名 Alias

別名可以透過例如 alias/0monitor/3 建立。unalias/1 將始終停用別名,而無論建立別名時使用的選項為何。

如果 Alias 是目前程序的作用中別名,則傳回 true;否則傳回 false。

有關程序別名的更多資訊,請參閱《Erlang 參考手冊》中 程序別名 章節。

連結到此函數

unlink(Id)

檢視來源碼 (自動匯入)
-spec unlink(Id) -> true when Id :: pid() | port().

移除呼叫進程與另一個進程或由 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

連結到此函數

unregister(RegName)

檢視原始碼 (自動匯入)
-spec unregister(RegName) -> true when RegName :: atom().

名稱註冊表中移除與進程識別碼或埠識別碼相關聯的已註冊名稱 RegName

例如

> unregister(db).
true

請記住,即使在註銷已註冊的名稱後,您仍然可以收到與該名稱相關的訊號,因為發送者可能在發送訊號前已經查找過該名稱。

建議使用者不要註銷系統程序。

失敗:如果 RegName 不是已註冊的名稱,則返回 badarg

連結到此函數

whereis(RegName)

檢視原始碼 (自動匯入)
-spec whereis(RegName) -> pid() | port() | undefined when RegName :: atom().

名稱註冊表 返回具有 已註冊名稱 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%
連結到此函數

halt(HaltType)

檢視原始碼 (自動匯入)
-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%
連結到此函數

halt/2

檢視原始碼 (自動匯入) (自 OTP R15B01 起)
-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 字串都是有效的。
-spec memory() -> [{Type, Size}] when Type :: memory_type(), Size :: non_neg_integer().

返回一個列表,其中包含有關 Erlang 模擬器動態配置的記憶體資訊。

每個列表元素都是一個元組 {Type, Size}。第一個元素 Type 是一個原子,描述記憶體類型。第二個元素 Size 是以位元組為單位的記憶體大小。

記憶體類型:

  • total - 目前已分配的記憶體總量。這與 processessystem 的記憶體大小總和相同。

  • 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 值是 processessystem 的總和,因此 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

連結到此函數

statistics(Item)

檢視原始碼 (自動匯入)
-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 線程。每個映射都包含 typeid 欄位,可用於識別是哪個線程,以及一個計數器欄位,其中包含關於在各種狀態下花費多少時間的資料。

    範例

    > 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_Types

    • scheduler - 主要的執行線程,執行大部分的工作。如需詳細資訊,請參閱 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 節點負載程度的更好指標,而不是查看 topsysstat 等工具提供的 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 時間。

連結到此函數

system_flag(Flag, Value)

檢視原始碼
-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,其中 Nerlang: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_allocF 是要變更的旗標,而 V 是新值。

    只有所有 erts_alloc 旗標的子集可以在執行階段變更。此子集目前僅為旗標 sbct

    如果已設定旗標,則回傳 ok;如果 erts_alloc 不支援,則回傳 notsup

    自 OTP 20.2.3 起可用

  • system_flag(fullsweep_after, non_neg_integer()) -> non_neg_integer()

    設定系統旗標 fullsweep_afterNumber 是一個非負整數,表示在強制執行 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/4process_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,4process_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,4process_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,且沒有其他人封鎖正常多重排程,且此程序僅封鎖一次,則會解除封鎖正常多重排程。

    一個程序可以多次封鎖多重排程和正常多重排程。如果程序已封鎖多次,則它必須解除封鎖的次數與其封鎖的次數完全相同,才能釋放其多重排程封鎖。如果已封鎖多重排程或正常多重排程的程序結束,則會自動釋放其對多重排程和正常多重排程的封鎖。

    回傳值為 disabledblockedblocked_normalenabled。回傳值描述在呼叫 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 決定排程器的綁定方式,可以是下列任何一種:

    • unbound - 與 erl 中的命令列引數 +sbt u 相同。

    • no_spread - 與 erl 中的命令列引數 +sbt ns 相同。

    • thread_spread - 與 erl 中的命令列引數 +sbt ts 相同。

    • processor_spread - 與 erl 中的命令列引數 +sbt ps 相同。

    • spread - 與 erl 中的命令列引數 +sbt s 相同。

    • no_node_thread_spread - 與 erl 中的命令列引數 +sbt nnts 相同。

    • no_node_processor_spread - 與 erl 中的命令列引數 +sbt nnps 相同。

    • thread_no_node_processor_spread - 與 erl 中的命令列引數 +sbt tnnps 相同。

    • default_bind - 與 erl 中的命令列引數 +sbt db 相同。

    傳回值等於變更旗標 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 作為 truefalse 來啟用或停用排程器牆鐘時間測量。

    如需更多關於如何使用排程器牆鐘時間測量的資訊,請參閱 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.

返回有關目前系統的資訊。

為了方便瀏覽,此函式的說明文件分為以下幾個部分。

記憶體分配

依照 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) 文件後,傳回的資訊或多或少是不言而喻的,但可能值得解釋一些內容。呼叫計數由兩個值表示,第一個值是千兆次呼叫,第二個值是呼叫。 mbcssbcs 分別表示多區塊載體和單區塊載體。大小以位元組為單位表示。當未顯示大小時,表示某物的數量。大小和數量通常由三個值表示

    • 第一個是目前值。
    • 第二個是自上次呼叫 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。由 spawnspawn_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+hmaxiblerl(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_heapon_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 - 傳回時間偏移量的狀態

    自:OTP 18.0 起

  • time_warp_mode - 傳回一個數值,識別目前使用的時間扭曲模式

    自:OTP 18.0 起

  • tolerant_timeofday - 傳回是否啟用為了與 ERTS 7.0 之前的版本回溯相容而對系統時間突然變更進行的補償,值為 enableddisabled。當時間偏移final,且時間校正已啟用時,此補償會enabled

    自:OTP 17.1

排程器資訊

依照 Item 指定,傳回目前系統中關於排程器、排程和執行緒的資訊。

分散式資訊

依照 Item 指定,傳回目前系統中關於 Erlang 分散式的資訊。

  • async_dist - 傳回執行階段系統使用的命令列引數 +pad <boolean> 的值。此值決定新產生程序的預設 async_dist 值。

    自:OTP 25.3

  • creation - 傳回本機節點的「建立」值,以整數表示。當節點重新啟動時,建立值會變更。節點的建立值會儲存在程序識別碼、連接埠識別碼和參照中。這樣可以區分來自節點不同化身的識別碼。建立值目前是 32 位元的正整數,但未來版本中可能會變更。如果節點未啟用,則傳回 0

  • delayed_node_table_gc - 傳回節點表中條目延遲垃圾回收的時間長度,以秒為單位。此限制可以在啟動時,透過傳遞命令列標誌 +zdntgcerl(1) 來設定。更多資訊,請參閱命令列標誌的說明文件。

    自:OTP 18.0 起

  • dist - 傳回一個二進制資料,其中包含格式化為 Erlang 崩潰傾印的散佈資訊字串。更多資訊,請參閱使用者指南中的 如何解讀 Erlang 崩潰傾印 章節。

  • dist_buf_busy_limit - 傳回散佈緩衝區忙碌限制的值,以位元組為單位。此限制可以在啟動時,透過傳遞命令列標誌 +zdbblerl(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 - 傳回一個原子,描述編譯到虛擬機器中的動態追蹤框架。它可以是 dtracesystemtapnone。對於商業或標準版本,它始終為 none。其他傳回值表示自訂組態(例如,./configure --with-dynamic-trace=dtrace)。有關動態追蹤的更多資訊,請參閱 dyntrace(3) 手冊頁和 Erlang 原始碼頂層目錄中的 README.dtrace/README.systemtap 檔案。

    自:OTP R15B01

  • dynamic_trace_probes - 傳回一個 t:boolean(),指示動態追蹤探針(dtracesystemtap)是否內建於模擬器中。只有當虛擬機器是為動態追蹤而建置時,此值才能為 true(也就是說,system_info(dynamic_trace) 傳回 dtracesystemtap)。

    自:OTP R15B01

  • emu_flavor - 傳回一個原子,描述執行時系統的風味。這將是 emujit。可能的傳回值可以隨時新增或移除,恕不另行通知。

    自:OTP 24.0

  • emu_type - 傳回一個原子,描述執行時系統的建置類型。這通常是最佳化版本的原子 opt。其他可能的傳回值為 debuggcovvalgrindgproflcnt。可能的傳回值可以隨時新增或移除,恕不另行通知。

    自: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 一樣。

連結到此函數

system_monitor(MonitorPid, Options)

檢視原始碼
-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} 送到 MonitorPidGcPid 是被垃圾回收的 pid。Info 是一個由雙元素元組組成的列表,描述垃圾回收的結果。

    其中一個元組是 {timeout, GcTime},其中 GcTime 是垃圾回收的時間,以毫秒為單位。其他元組標記有 heap_sizeheap_block_sizestack_sizembuf_sizeold_heap_sizeold_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 等於 falselong_message_queue 監控訊息,表示該行程不再處於長訊息佇列狀態。因此,如果訊息佇列長度再次達到 Enable 長度,則會再次傳送 Long 設定為 true 的新的 long_message_queue 監控訊息。也就是說,當行程進入或離開長訊息佇列狀態時,會傳送 long_message_queue 監控訊息,而這些狀態變更是由 EnableDisable 參數所定義。

    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}Opproc_sigtimeoutinputoutputeventdist_cmd 其中之一,具體取決於正在執行的驅動程式回呼函數。

    proc_sig 是一種內部操作,永遠不會出現,而其他操作則表示相應的驅動程式回呼函數 timeoutready_inputready_outputeventoutputv(當埠用於分散式時)。元組 timeout 中的值 Millis 表示行程或埠不間斷的執行時間,該值始終等於或高於啟動追蹤時提供的 Time 值。未來版本可能會向 Info 清單中新增新的元組。清單中元組的順序可以隨時變更,恕不另行通知。

    這可用於偵測 NIF 或驅動程式執行時間過長的問題。1 毫秒被認為是驅動程式回呼函數或 NIF 的理想最大時間。然而,分時系統通常認為任何小於 100 毫秒的執行時間都是「可能」且相當「正常」的。但是,較長的排程時間可能表示正在進行交換或 NIF/驅動程式行為異常。行為異常的 NIF 和驅動程式可能導致資源利用率不佳和整體系統效能不佳。

  • {large_heap, Size} - 如果系統中的垃圾回收導致堆積分配的大小至少為 Size 個字,則會向 MonitorPid 傳送訊息 {monitor, GcPid, large_heap, Info}GcPidInfo 與先前的 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。選項的順序可能與設定時的順序不同。

連結到此函數

system_profile(ProfilerPid, Options)

檢視原始碼
-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 的行為可能會在未來版本中變更。

時間和計時器

連結到此函數

cancel_timer(TimerRef)

檢視原始碼
-spec cancel_timer(TimerRef) -> Result
                      when TimerRef :: reference(), Time :: non_neg_integer(), Result :: Time | false.

等同於 erlang:cancel_timer(TimerRef, [])

連結到此函數

cancel_timer(TimerRef, Options)

檢視原始碼 (自 OTP 18.0 起)
-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_timererlang:send_after 建立的計時器。TimerRef 識別計時器,並由建立計時器的 BIF 返回。

Option 選項

  • {async, Async} - 非同步取消請求。Async 預設為 false,這會導致同步執行取消。當 Async 設定為 true 時,取消操作會以非同步方式執行。也就是說,cancel_timer() 會向管理計時器的計時器服務傳送非同步取消請求,然後傳回 ok

  • {info, Info} - 請求有關取消 Result 的資訊。Info 預設為 true,表示會提供 Result。當 Info 設定為 false 時,不會提供有關取消結果的任何資訊。

    • Asyncfalse 時:如果 Infotrue,則 Resulterlang:cancel_timer() 傳回。否則會傳回 ok
    • Asynctrue 時:如果 Infotrue,則當執行取消操作時,會向 erlang:cancel_timer() 的呼叫者傳送格式為 {cancel_timer, TimerRef, Result} 的訊息,否則不會傳送任何訊息。

未來可能會新增更多 Option

如果 Result 是整數,則表示已取消計時器到期前剩餘的時間(以毫秒為單位)。

如果 Resultfalse,則表示找不到與 TimerRef 對應的計時器。這可能是因為計時器已過期、已取消,或者因為 TimerRef 從未對應到計時器。即使計時器已過期,它也不會告訴您逾時訊息是否已到達其目的地。

注意

管理計時器的計時器服務可能與呼叫行程正在執行的排程器不在同一個排程器上。如果是這樣,與計時器服務的通訊將比在本地執行時花費更長的時間。如果呼叫行程在關鍵路徑中,並且可以在等待此操作結果時執行其他操作,或者不關心操作結果,則需要使用選項 {async, true}。如果使用選項 {async, false},則呼叫行程會封鎖,直到執行完操作。

另請參閱 erlang:send_after/4erlang:start_timer/4erlang:read_timer/2

連結到此函數

convert_time_unit(Time, FromUnit, ToUnit)

檢視原始碼 (自 OTP 18.0 起)
-spec convert_time_unit(Time, FromUnit, ToUnit) -> ConvertedTime
                           when
                               Time :: integer(),
                               ConvertedTime :: integer(),
                               FromUnit :: time_unit(),
                               ToUnit :: time_unit().

將時間單位 FromUnitTime 值轉換為對應的時間單位 ToUnitConvertedTime 值。使用 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}}

時區和日光節約時間校正取決於底層作業系統。傳回值基於 作業系統系統時間

連結到此函數

localtime_to_universaltime(Localtime)

檢視原始碼
-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

連結到此函數

localtime_to_universaltime(Localtime, IsDst)

檢視原始碼
-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

連結到此函數

monotonic_time()

檢視原始碼 (自 OTP 18.0 起)
-spec monotonic_time() -> integer().

時間單位 native 形式返回目前的 Erlang 單調時間。這是自某個未指定的時間點以來單調增加的時間。

注意

這是一個單調遞增的時間,但不是一個嚴格單調遞增的時間。也就是說,連續呼叫 erlang:monotonic_time/0 可能會產生相同的結果。

不同的執行階段系統實例將使用時間中不同的未指定點作為其 Erlang 單調時鐘的基礎。也就是說,比較來自不同執行階段系統實例的單調時間是毫無意義的。不同的執行階段系統實例也可以將此未指定的時間點放置在相對於執行階段系統啟動的不同位置。它可以放置在未來(啟動時的時間是負值)、過去(啟動時的時間是正值)或執行階段系統啟動時(啟動時的時間為零)。執行階段系統啟動時的單調時間可以透過呼叫 erlang:system_info(start_time) 來擷取。

連結到此函數

monotonic_time(Unit)

檢視原始碼 (自 OTP 18.0 起)
-spec monotonic_time(Unit) -> integer() when Unit :: time_unit().

返回目前的 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, [])

連結到此函數

read_timer(TimerRef, Options)

檢視原始碼 (自 OTP 18.0 起)
-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_timererlang:send_after 建立的計時器的狀態。TimerRef 識別計時器,並由建立計時器的 BIF 返回。

選項:

  • {async, Async} - 非同步狀態資訊請求。Async 預設為 false,這會導致作業同步執行。在這種情況下,Result 會由 erlang:read_timer 傳回。當 Asynctrue 時,erlang:read_timer 會向管理計時器的計時器服務傳送非同步狀態資訊請求,然後傳回 ok。當作業處理完成時,會將格式為 {read_timer, TimerRef, Result} 的訊息傳送到 erlang:read_timer 的呼叫者。

未來可能會加入更多 Option

如果 Result 是整數,則表示距離計時器過期剩餘的時間(以毫秒為單位)。

如果 Resultfalse,則找不到與 TimerRef 對應的計時器。這是因為計時器已過期或已取消,或者因為 TimerRef 從未對應到計時器。即使計時器已過期,它也不會告訴您逾時訊息是否已到達目的地。

注意

管理計時器的計時器服務可以與呼叫程序在其上執行的排程器位於不同的位置。如果是這樣,與計時器服務的通訊將比在本地時花費更長的時間。如果呼叫程序位於關鍵路徑中,並且可以在等待此作業的結果時執行其他操作,則您會想要使用選項 {async, true}。如果使用選項 {async, false},則呼叫程序會被封鎖,直到作業執行完成。

另請參閱 erlang:send_after/4erlang:start_timer/4erlang:cancel_timer/2

連結到此函數

send_after(Time, Dest, Msg)

檢視原始碼
-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, [])

連結到此函數

send_after(Time, Dest, Msg, Options)

檢視原始碼 (自 OTP 18.0 起)
-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 完全相同。

連結到此函數

start_timer(Time, Dest, Msg)

檢視原始碼
-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, [])

連結到此函數

start_timer(Time, Dest, Msg, Options)

檢視原始碼 (自 OTP 18.0 起)
-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 值為負數。

如果 Destpid/0,則它必須是目前執行階段系統實例上建立的程序的 pid/0。此程序已終止或尚未終止。如果 Destatom/0,則會將其解釋為本地註冊程序的名稱。計時器過期時會查詢名稱所指的程序。如果名稱未指到任何程序,則不會傳回錯誤。

如果 Destpid/0,則如果 pid/0 所指的程序沒有在執行,或如果該程序結束,則會自動取消計時器。此功能是在 ERTS 5.4.11 中引入的。請注意,當 Destatom/0 時,計時器不會自動取消。

另請參閱 erlang:send_after/4erlang:cancel_timer/2erlang:read_timer/2

如需有關 Erlang 中計時器的更多資訊,請參閱 Erlang 中的時間和時間校正 ERTS 使用者指南的 計時器 章節。

失敗:如果引數不符合此處指定的規定,則返回 badarg

連結到此函數

system_time()

檢視原始碼 (自 OTP 18.0 起)
-spec system_time() -> integer().

時間單位 native 形式返回目前的 Erlang 系統時間

呼叫 erlang:system_time() 等效於 erlang:monotonic_time()+erlang:time_offset()

注意

在一般情況下,此時間不是單調遞增的時間。如需更多資訊,請參閱使用者指南中時間扭曲模式的文件。

連結到此函數

system_time(Unit)

檢視原始碼 (自 OTP 18.0 起)
-spec system_time(Unit) -> integer() when Unit :: time_unit().

返回目前的 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}
連結到此函數

time_offset()

檢視原始碼 (自 OTP 18.0 起)
-spec time_offset() -> integer().

時間單位 native 形式返回 Erlang 單調時間Erlang 系統時間 之間的目前時間偏移量。目前的 時間偏移量加上 Erlang 單調時間會得出對應的 Erlang 系統時間。

時間偏移量可能會在操作期間變更或不變更,具體取決於所使用的時間扭曲模式

注意

不同的程序可能會在略微不同的時間點觀察到時間偏移量的變更。

如果執行階段系統處於多時間扭曲模式,則當執行階段系統偵測到作業系統系統時間已變更時,時間偏移量會變更。但是,執行階段系統不會在發生時立即偵測到這一點。檢查時間偏移量的任務會排程為至少每分鐘執行一次;因此,在正常操作下,這會在 1 分鐘內偵測到,但在負載較重時可能會花費更長的時間。

連結到此函數

time_offset(Unit)

檢視原始碼 (自 OTP 18.0 起)
-spec time_offset(Unit) -> integer() when Unit :: time_unit().

返回 Erlang 單調時間Erlang 系統時間 之間的目前時間偏移量,並轉換為作為引數傳遞的 Unit

與呼叫 erlang:convert_time_unit( erlang:time_offset(), native, Unit) 相同,但針對常用的 Unit 進行了最佳化。

連結到此函數

timestamp()

檢視原始碼 (自 OTP 18.0 起)
-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}}
連結到此函數

universaltime_to_localtime(Universaltime)

檢視原始碼
-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

追蹤

連結到此函數

trace(PidPortSpec, How, FlagList)

檢視原始碼
-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/4trace:port/4 取代。

引數 FlagList 可以包含兩個額外選項

  • {tracer, Tracer} - 指定要將追蹤訊息傳送至何處。Tracer 必須是本機處理程序的處理程序識別碼或本機埠的埠識別碼。

  • {tracer, TracerModule, TracerState} - 指定要呼叫追蹤器模組,而不是傳送追蹤訊息。然後追蹤器模組可以忽略或變更追蹤訊息。有關如何編寫追蹤器模組的更多詳細資訊,請參閱 erl_tracer

如果未指定 tracer,則呼叫處理程序會收到所有追蹤訊息。舊版追蹤工作階段沒有指定的追蹤器。

如需進一步的文件,請參閱 trace:process/4trace:port/4

連結到此函數

trace_delivered(Tracee)

檢視原始碼
-spec trace_delivered(Tracee) -> Ref when Tracee :: pid() | all, Ref :: reference().

呼叫此函式可確保已傳遞所有追蹤訊息。

追蹤訊息的傳遞 (由 erlang:trace/3seq_traceerlang: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 訊息之前,追蹤回呼中傳送的任何訊息都已到達其接收者。

範例:處理程序 ATracee,埠 B 是追蹤器,而處理程序 CB 的埠擁有者。C 希望在 A 結束時關閉 B。為了確保追蹤不會被截斷,C 可以在 A 結束時呼叫 erlang:trace_delivered(A),並等待訊息 {trace_delivered, A, Ref},然後再關閉 B

失敗:如果 Tracee 未參照與 erlang:trace_delivered(Tracee) 的呼叫者所在的同一節點上的處理程序 (已死或存活),則為 badarg

連結到此函數

trace_info(PidPortFuncEvent, Item)

檢視原始碼
-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 取代。

連結到此函數

trace_pattern(MFA, MatchSpec)

檢視原始碼
-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, []),為保持回溯相容性而保留。

連結到此函數

trace_pattern(MFA, MatchSpec, FlagList)

檢視原始碼
-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/4trace:send/3trace:recv/3 取代。

引數 FlagList 可以包含用於呼叫追蹤的兩個額外選項

  • {meta, Pid} | {meta, TracerModule, TracerState} - 開啟或關閉所有類型函式呼叫的中繼追蹤。每當呼叫任何指定的函式時,都會將追蹤訊息傳送至追蹤器。如果未指定追蹤器,則會使用 self/0 作為預設追蹤器處理程序。

如需進一步的文件,請參閱 trace:function/4trace:send/3trace:recv/3

已棄用的函式

此函式已棄用。erlang:now/0 已棄用;如需更多資訊,請參閱 ERTS 使用者指南的「Erlang 中的時間和時間校正」章節。
-spec now() -> Timestamp when Timestamp :: timestamp().

警告

此函式已棄用。請勿使用。

如需更多資訊,請參閱使用者指南中的 時間和時間校正 一節。具體來說,應該和不應該 一節說明了應該使用什麼來取代 erlang:now/0

傳回元組 {MegaSecs, Secs, MicroSecs},如果基礎作業系統提供,則這是自 1970 年 1 月 1 日 00:00 GMT (零時) 起經過的時間。否則,會選擇其他時間點。還可以保證此 BIF 的以下呼叫會傳回持續增加的值。因此,erlang:now/0 的傳回值可用於產生唯一的時間戳記。如果在快速機器上以緊密迴圈呼叫它,則節點的時間可能會傾斜。

只有在正確設定基礎作業系統的時區資訊時,才能用於檢查當地時間。

此函式已棄用。erlang:phash/2 已棄用;請改用 erlang:phash2/2。
-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 中引入的)。函式傳回 Term1..Range 範圍內的雜湊值。Range 的最大值為 2^32。