檢視原始碼 埠與埠驅動程式

如何使用埠和埠驅動程式的範例,請參閱互通性教學。關於提及的 BIF 的資訊,請參閱 ERTS 中的 erlang 模組。

從 Erlang 的角度來看,提供了與外部世界溝通的基本機制。它們提供了與外部程式的位元組導向介面。當建立埠之後,Erlang 可以透過傳送和接收位元組列表(包含二進位資料)來與它通訊。

建立埠的 Erlang 程序被稱為埠擁有者,或該埠的已連線程序。所有與埠的通訊都必須通過埠擁有者。如果埠擁有者終止,埠也會終止(如果外部程式編寫正確,則外部程式也會終止)。

外部程式駐留在另一個作業系統程序中。預設情況下,它從標準輸入(檔案描述符 0)讀取,並寫入標準輸出(檔案描述符 1)。當埠關閉時,外部程式應終止。

埠驅動程式

可以根據某些原則用 C 撰寫驅動程式,並將其動態連結到 Erlang 運行時系統。從 Erlang 程式設計師的角度來看,連結的驅動程式看起來像一個埠,並被稱為埠驅動程式

警告

錯誤的埠驅動程式會導致整個 Erlang 運行時系統洩漏記憶體、掛起或崩潰。

關於埠驅動程式的資訊,請參閱

埠 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 可以使用

還有一些適用於埠驅動程式的其他 BIF