問題タブ [erl-interface]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - erlang:ei_get_type():'type'フィールドに定義された定数はどこにありますか?
ei_get_type()(ei )を使用しようとしていますが、「type」フィールドが文書化されている場所を見つけるのに問題があります。ei.hを調べましたが、「ERL_」で始まる定数のリストしか見つかりませんでした。
これは正しいリストですか?er_get_type()のプロトタイプには型フィールドの* int **があるのに対し、ei.hファイルはcharを上記の定数で定義しているのでわかりません。
注:ここにリストされていない「erl_interface」パッケージで使用される他の「定数」があります。
c# - 管理されていない dll を呼び出すときの AccessViolation
ac# アプリケーションからアンマネージ Dll を呼び出すと、AccessViolationException
. 奇妙なことに、エクスポートされた関数には引数がないため、問題はデータのマーシャリングにはありません。この関数は引数を取得せず、整数を返すだけです。また、呼び出し規約は問題ではないことに注意してください。同じゼロ引数と整数の戻り値 (ただし名前は異なる) を持つ同一の関数は問題なく動作します。マーシャリングと呼び出し規則が除外されているという事実を考慮して、そのような呼び出しがこの例外を引き起こす可能性がある残りの候補となる理由は何ですか?
更新: プレーン リンクを介して他のアンマネージ コードから呼び出された場合、完全に機能するため、dll 関数は正しいです。
更新 2: すべてがコンパイルされ、32 ビットで実行されます。Windows XP SP2 と Vista を試しました。ここに興味深い事実があります。Vista システムでは、これは魔法のように機能します。XPでは失敗します。
更新 3: ソース コードを入手できませんでしたが、この dll が本質的に何をするかを知ったので、自分の dll で問題を再現しようとしました。ここに話があります: 元の dll は、ei.lib (Erlang の c インターフェイス ライブラリ) へのある種のラッパーです。いくつかのヘルパー関数をエクスポートします。したがって、問題を再現するために、「test()」という 1 つの関数のみをエクスポートする ei.lib のラッパー dll を作成しました。マーシャリングなどを台無しにしないように、そうしました。初期化、接続、メッセージの送信をテストしたかっただけです。したがって、この dll の test() func は、 を呼び出してei_connect_init()
から、最後ei_connect()
にei_reg_send()
、内部にハードコードされた引数を持ちます。問題は、この dll を呼び出して別のアンマネージ コードから test() 関数を使用すると、問題なく動作することです。メッセージが送信されます。しかし、DllImport を介して c# から呼び出すと、Vista でのみ機能します。XPではありません。XP では、.net 層で AccessViolationException で失敗します。私は問題を追跡しようとしましたが、XP で実行されていてマネージ コードによって呼び出されている場合、dll 内から への呼び出しei_connect()
、または読み取りの試みerl_errno
(これらは ei.lib で定義されています) が読み取ろうとしていることがわかります。または、アプリがクラッシュするように保護されたメモリを書き込みます。Vistaで動作し、アンマネージコードから呼び出されたときに動作するため、些細なことではありません。
erlang - スレッド化された Erlang C-Node(cnode) の相互運用性 HOWTO?
現在、Erlang 開発の段階で C ノードを作成する必要があります ( C ノードのドキュメントへのリンクを参照してください)。基本的な実装は単純ですが、ドキュメントには大きな穴があります。
このコードは、シングル スレッドのクライアントとサーバーを実装します。しばらくクライアントを無視します... サーバーを実装する 'c' コードはシングル スレッドであり、一度に 1 つの erlang クライアントにしか接続できません。
- EPMD を起動します ('epmd -daemons')
- サーバー アプリケーション ('cserver 1234') を起動します。
- erlang クライアント アプリケーションを起動します ('erl -sname e1 -setcookie secretcookie') [#2 とは別のウィンドウで]
- #3 の erlang シェルからサーバー コマンド ('complex3:foo(3).') を実行します。
サーバーが実行され、現在の erlang シェルがサーバーに接続されたので、別のウィンドウから再試行してください。
- 新しいウィンドウを開きます。
- erlang クライアントを起動します ('erl -sname e2 -setcookie secretcookie')。
- 新しいサーバー コマンド ('complex3:foo(3)') を実行します。
システムがハングしているように見えることに注意してください...コマンドを実行する必要があるときに。ハングする理由は、他の erlang ノードが接続されており、接続をリッスンしているスレッドが他にないためです。
注:接続処理にバグがあるようです。受信ブロックにタイムアウトを追加し、いくつかの異常な動作をキャッチしましたが、すべてを取得することはできませんでした。また、指示された手順を実行した後に最初の erlang ノードを強制的に終了させた場合、警告やエラーなしで cserver をクラッシュさせることができました。
そこで質問です... スレッド化された C-Node を実装する最良の方法は何ですか? 妥当な接続数はいくつですか?
event-handling - C Node で Erlang OTP 動作を取得できますか?
たとえば、現在、erlang ノード ( ENと呼びます) に接続し、RPC を使用して OTP 動作を使用する C ノード ( CNと呼びます) があります。したがって、CNからENのイベント マネージャにイベントを送信するには、 CNをENに接続して次のようにします。
しかし、私の C ノードは実際にはノードとして動作していません (つまり、なぜリモート プロシージャ コールのみを使用するノードを作成するのでしょうか?)。
C ノード内で OTP 動作を直接使用する方法はありますか?
存在しない場合、OTP で使用されているメッセージ形式を調べて、その形式を使用してメッセージを送信する必要があります (つまり、OTP の動作を偽装できますか?)。私はこの考えが好きではありません.OTPの実装などの変更に注意する必要があります.
私の要件にはレイテンシーの厳しい制限があります。これは、C プロセスと Erlang の間の通信の選択にどのように影響しますか (RPC は私を行き詰まらせますか? など)?
c - erl_interface リンカ エラー
C プログラムでerl_interfaceを使用する必要があります。Debian Wheezy には Erlang R15B01 があります。
私は次のことを行います(たとえば)。
それから私は言います:
-L として指定されたディレクトリには含まれlibei.a
てliberl_interface.a
いますが、erl_init への参照を悪用するリンカは未定義です:undefined reference to erl_init
何が間違っている可能性がありますか?本当にくだらない質問ですみません。
process - Erlang C ノードでのプロセス リンクの実装
C ノードでの「プロセス」の監視がサポートされていないことはわかっていますが、Erlang ノードで C ノードから発信された pid のリンクを呼び出そうとすると、C ノードは最初にERL_LINK
メッセージを取得し、その後すぐにメッセージをERL_EXIT
取得します。明らかに、リンクされた Erlang プロセスがクラッシュしたためです。
おそらく、C ノードが に応答せずERL_LINK
、Erlang が C ノードの「プロセス」が終了したと判断したためです。
これがサポートされているかどうかを知りたいですか?ERL_LINK
そして、これを機能させるために、Cノードはメッセージをどのように処理する必要がありますか.