Remote Messaging / Erlang

Message Queue の実装でもよく使われているErlang。メッセージの送受信と、外部プログラムのインターフェイスを一緒にテストしてみました。

環境: Erlang (BEAM) emulator version 5.9.2 / Mac 10.10.5

参考:
http://erlang.org/doc/tutorial/c_port.html
http://d.hatena.ne.jp/m-hiyama/20070704/1183510151
http://d.hatena.ne.jp/m-hiyama/20070710/1184035643

receiver.erl

sender.erl

(hostname)は環境に合わせる

receiverから実行するCプログラム
port.c

comm.c

コンパイル

gcc -o extprg port.c comm.c -ansi

実行
受信側

erl -sname node2
Eshell> c(receiver).
{ok,receiver}
Eshell> receiver:start(“./extprg”).
<0.44.0>
%受信待ち->送信されると以下表示
size : 5
72 101 108 108 111 0 0 0 0 0

送信側

erl -sname node1
Eshell> c(sender).
{ok,sender}
Eshell> sender:start().
Sending message “Hello” to {rcv, ‘node2@(hostname)’}.
<0.44.0>
Remote node is up, sent.
Waiting for a message …Receive! From: <6939.44.0> Msg: Ifmmp

Cプログラムではデータをインクリメントして値を返すので、HelloがIfmmpとなります。

受信側で登録したrcvが送信側のプログラムで参照されているところがポイントだと思います。テストはここではローカルだけですが、Mac-Ubuntu間も確認済み。(cookieの設定の仕方とかも、上記サイトにあります。)
この共有されたrcvについて考えてみると、Erlangの分散処理の性質を感られる気がします。Erlangはとても興味があり、
http://decode.red/net/archives/140
http://bitlife.me/archives/231
上の記事につづいて、取り上げてみました。