2008-09-01 50 views
13

我正在探索在Erlang中編寫應用程序的可能性,但它需要有一部分用Cocoa編寫(推測Objective-C)。我希望前端和後端能夠輕鬆溝通。如何做到這一點最好?寫一個Cocoa前端到Erlang應用程序的好方法是什麼?

我可以想到使用C端口和連接的進程,但我想我想要一個相反的情況(前端啓動並連接到後端)。有命名管道(FIFOs),或者我可以通過TCP端口或命名的BSD套接字使用網絡通信。有沒有人有這方面的經驗?

回答

10

一種方法是將應用程序的Erlang核心作爲Cocoa前端使用您設計的一些簡單協議通過Unix域套接字進行通信的守護程序。

使用Unix域套接字意味着Erlang守護進程可以通過launchd按需啓動,而Cocoa前端可以通過環境變量找到要使用的套接字的路徑。這使得應用程序和守護進程之間的會合變得微不足道,並且它還使開發多個前端(或者可能包含與守護進程進行通信的框架)變得簡單。

Mac OS X launchd這個系統真的很酷。如果您指定應通過安全的Unix域套接字按需啓動作業,則launchd實際上將創建具有適當權限的套接字本身,並通過作業屬性列表中指定的環境變量通告其位置。作業在啓動時,實際上會通過launchd將文件描述符傳遞到套接字,當它執行簡單的檢入時。

最終這意味着前端打開套接字與守護進程通信的整個過程,啓動守護進程的launchd以及響應通信的守護進程可以是安全的,即使前端和守護進程運行在不同的權限級別。

+0

不幸的是,launchd的這些天只是令人遺憾地沒有記錄。 – uchuugaka 2016-06-23 15:28:14

1

通常創建前UNIX命令Cocoa應用程序或其他無頭的程序,當您使用NSTask

使用NSTask類,程序可以運行另一個程序作爲子進程,並可以監視程序的執行。 NSTask對象創建一個單獨的可執行實體;它與NSThread的區別在於它不會與創建它的進程共享內存空間。

任務在多個項目的當前值定義的環境中運行:當前目錄,標準輸入,標準輸出,標準錯誤和任何環境變量的值。默認情況下,NSTask對象從啓動它的進程繼承它的環境。如果任務的值應該不同,例如,如果當前目錄應該更改,則必須在啓動任務之前更改該值。任務的環境在運行時不能更改。

您可以通過的stdin/stdout/stderr方式後端進程進行通信。 Bascially NSTaskexec(或forksystem,我總是忘記區別)的高級包裝。

據我瞭解,您不希望Erland程序成爲連續運行的後臺守護程序,但如果這樣做,請使用@Chris's建議。

1

erl_call應使用從NSTask。我從Textmate命令中使用它,速度非常快。將erl_call和OTP gen_server結合起來可以讓你相對容易地保持持久的後端狀態。有關更多詳細信息,請在我的博客上查看我在erl_call上的文章。

1

使用NSTask你也可以考慮使用PseudoTTY.app(它允許交互式通信)!

另一個感興趣的示例代碼可以是BigSQL,一種PostgreSQL客戶端,它允許用戶將SQL發送到服務器並顯示結果。

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml 
相關問題