檢視原始碼 埠與埠驅動程式
如何使用埠和埠驅動程式的範例,請參閱互通性教學。關於提及的 BIF 的資訊,請參閱 ERTS 中的 erlang
模組。
埠
從 Erlang 的角度來看,埠提供了與外部世界溝通的基本機制。它們提供了與外部程式的位元組導向介面。當建立埠之後,Erlang 可以透過傳送和接收位元組列表(包含二進位資料)來與它通訊。
建立埠的 Erlang 程序被稱為埠擁有者,或該埠的已連線程序。所有與埠的通訊都必須通過埠擁有者。如果埠擁有者終止,埠也會終止(如果外部程式編寫正確,則外部程式也會終止)。
外部程式駐留在另一個作業系統程序中。預設情況下,它從標準輸入(檔案描述符 0)讀取,並寫入標準輸出(檔案描述符 1)。當埠關閉時,外部程式應終止。
埠驅動程式
可以根據某些原則用 C 撰寫驅動程式,並將其動態連結到 Erlang 運行時系統。從 Erlang 程式設計師的角度來看,連結的驅動程式看起來像一個埠,並被稱為埠驅動程式。
警告
錯誤的埠驅動程式會導致整個 Erlang 運行時系統洩漏記憶體、掛起或崩潰。
關於埠驅動程式的資訊,請參閱
- erl_driver 在 ERTS 中
- driver_entry 在 ERTS 中
erl_ddll
在 Kernel 中
埠 BIF
要建立埠,請呼叫 open_port(PortName, PortSettings)
。它會傳回埠識別符 Port
作為開啟新埠的結果。可以像 PID 一樣,向埠識別符傳送和接收訊息。也可以使用 link/1
連結埠識別符,或使用 register/2
註冊名稱。
PortName
通常是一個元組 {spawn,Command}
,其中字串 Command
是外部程式的名稱。除非找到名稱為 Command
的埠驅動程式,否則外部程式會在 Erlang 工作空間之外執行。如果找到 Command
,則會啟動該驅動程式。
PortSettings
是埠的設定(選項)列表。此列表通常至少包含一個元組 {packet,N}
,它指定在埠和外部程式之間傳送的資料前面加上一個 N 位元組長度指示符。N 的有效值為 1、2 或 4。如果要使用二進位資料而不是位元組列表,則必須包含選項 binary
。
埠擁有者 Pid
可以透過傳送和接收訊息來與埠 Port
通訊。(實際上,任何程序都可以將訊息傳送給埠,但必須在訊息中識別埠擁有者)。
傳送給埠的訊息是異步傳遞的。
變更
在 Erlang/OTP 16 之前,傳送給埠的訊息是同步傳遞的。
在以下範例中,Data
必須是 I/O 列表。I/O 列表是一個二進位資料,或是一個(可能很深的)二進位資料或 0 到 255 範圍內的整數列表。
以下訊息可以傳送給埠
{Pid,{command,Data}}
- 將Data
傳送給埠。{Pid,close}
- 關閉埠。除非埠已關閉,否則當所有緩衝區已刷新且埠真正關閉時,埠會回覆{Port,closed}
。{Pid,{connect,NewPid}}
- 將Port
的埠擁有者設定為NewPid
。除非埠已關閉,否則埠會向舊埠擁有者回覆{Port,connected}
。請注意,舊埠擁有者仍然連結到埠,但新埠擁有者沒有。
以下是可以從埠接收的訊息。它們會傳送給擁有該埠的程序
{Port,{data,Data}}
- 從外部程式接收Data
。{Port,closed}
- 回覆Port ! {Pid,close}
。{Port,connected}
- 回覆Port ! {Pid,{connect,NewPid}}
。{'EXIT',Port,Reason}
- 如果埠因某些原因終止。
除了傳送和接收訊息之外,還有一些 BIF 可以使用
port_command(Port, Data)
- 將Data
傳送給埠。port_close(Port)
- 關閉埠。port_connect(Port, NewPid)
- 將Port
的埠擁有者設定為NewPid
。舊埠擁有者Pid
仍然連結到埠,如果不需要,則必須呼叫unlink(Port)
。erlang:port_info(Port, Item)
- 傳回由Item
指定的資訊。erlang:ports()
- 傳回目前節點上所有埠的列表。
還有一些適用於埠驅動程式的其他 BIF