13

Erlang でアプリケーションを作成する可能性を探っていますが、一部を Cocoa (おそらく Objective-C) で作成する必要があります。フロントエンドとバックエンドが簡単に通信できるようにしてほしい。どうすればこれを行うことができますか?

C ポートと接続プロセスを使用することも考えられますが、逆の状況 (フロントエンドが起動してバックエンドに接続) が必要だと思います。名前付きパイプ (FIFO) があるか、TCP ポートまたは名前付き BSD ソケットを介したネットワーク通信を使用できます。この分野で経験のある人はいますか?

4

6 に答える 6

10

1 つの方法は、アプリケーションの Erlang コアを、Cocoa フロントエンドが、考案した単純なプロトコルを使用して Unix ドメイン ソケットを介して通信するデーモンにすることです。

Unix ドメイン ソケットの使用は、Erlang デーモンをオンデマンドで起動できlaunchd、Cocoa フロントエンドが環境変数を介して使用するソケットへのパスを見つけることができることを意味します。これにより、アプリとデーモンの間のランデブーが簡単になり、複数のフロントエンド (または、デーモンとの通信をラップするフレームワーク) の開発も簡単になります。

このように、Mac OS Xlaunchdシステムは非常に優れています。安全な Unix ドメイン ソケットを介してオンデマンドでジョブを起動するように指定すると、launchdは実際にソケット自体を適切な権限で作成し、ジョブのプロパティ リストで指定された環境変数を介してその場所を通知します。launchdジョブが開始されると、単純なチェックインを実行するときに、実際にファイル記述子がソケットに渡されます。

最終的にこれは、フロントエンドがソケットを開いてデーモンと通信し、デーモンを起動し、通信に応答するデーモンのプロセス全体が、launchdフロントエンドとデーモンが異なる特権レベルで実行されている場合でも安全であることを意味します。 .

于 2008-09-01T03:11:18.473 に答える
2

1つの方法は、NSTask、NSPipe、およびNSFileHandleを使用したTheoの方法です。CouchDBXのコードを確認することから始めることができますhttp://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

ポートは可能ですが、まったく良くありません。

この通信をmochiwebとjsonの通信で簡単に処理できない理由はありますか?

于 2008-09-10T15:44:57.243 に答える
1

NSTask と Unix ドメイン ソケットのアプローチはどちらも優れた提案です。注目すべきことは、作業中の Erlang FFI 実装です。

http://muvara.org/crs4/erlang/ffi

于 2008-09-10T15:49:40.337 に答える
1

NSTask を使用すると、 PseudoTTY.app (インタラクティブな通信が可能になります) の使用も検討できます。

もう 1 つの興味深いサンプル コードは、BigSQL です。これは、ユーザーが SQL をサーバーに送信して結果を表示できるようにする PostgreSQL クライアントです。

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
于 2010-09-22T12:28:50.343 に答える
1

通常、UNIX コマンドやその他のヘッドレス プログラムの前に配置する Cocoa アプリケーションを作成する場合は、以下を使用しますNSTask

NSTask クラスを使用すると、プログラムで別のプログラムをサブプロセスとして実行し、そのプログラムの実行を監視できます。NSTask オブジェクトは、別個の実行可能なエンティティを作成します。それを作成するプロセスとメモリ空間を共有しないという点で、NSThread とは異なります。

タスクは、いくつかの項目 (現在のディレクトリ、標準入力、標準出力、標準エラー、および環境変数の値) の現在の値によって定義された環境内で動作します。デフォルトでは、NSTask オブジェクトはそれを起動したプロセスから環境を継承します。タスクに対して異なる値がある場合 (たとえば、現在のディレクトリを変更する必要がある場合)、タスクを起動する前に値を変更する必要があります。実行中のタスクの環境は変更できません。

stdin//経由でバックエンド プロセスと通信できstdoutますstderr。BasciallyNSTaskは高レベルのラッパーですexec(またはforkまたはsystem、私はいつも違いを忘れています)。

私が理解しているように、Erland プログラムを継続的に実行するバックグラウンド デーモンにしたくない場合は、@Chris の提案に従ってください。

于 2008-09-01T09:58:29.663 に答える
1

erl_call は NSTask から使用できる必要があります。Textmate コマンドから使用していますが、非常に高速です。erl_call を OTP gen_server と組み合わせると、バックエンドの永続的な状態を比較的簡単に維持できます。詳細については、私のブログの erl_call に関する投稿を参照してください。

于 2008-10-26T14:09:04.480 に答える