問題タブ [interprocess]
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.
c++ - プロセス間マップとmap/unordered_map
std::mapとboost::unordered_mapの違いについては多くの議論があります。しかし、boost :: interprocess :: mapはどうですか?
誰かがboost::interprocess::mapとstd::mapの間でパフォーマンステストを実行しましたか?
私はinterprocess::mapをあまり使用していませんが、1Mを超えると、非常に遅くなると感じています。
ありがとう
file - 中間ファイルは悪い習慣ですか?
私は最近、この質問に対する答えに反対票を投じました(これは私を少しだけ悩ませました:)) 。その人は、私が「なぜ中間ファイルの作成を避けるのか」と考え始めた反対票についての説明を提供しませんでした。特にPythonのように、ファイルIOが笑えるほど簡単な言語では。
それは悪い考えだというコンセンサスがあったようですが、実際には中間ファイルが定期的に使用されていることは知っています。私は非常に尊敬されている研究会社で働いていました(この会社なしではSOは存在しなかったとしましょう)。そこでは、プログラムが出力としてファイルを生成すると想定されていました。これを行ったのは、プログラムが実際にスタンドアロンプログラムに値する場合、デバッグ可能な出力と、さらに下流の出力でエラーが見つかった場合に後で調べることができるプロセス間でその出力を渡す何らかの方法が必要になるためです。
中間ファイルを使用することは(上記の質問のような場合)悪い習慣と見なされますか?なんで?
bash - キーボードと名前付きパイプを Bash の STDIN に接続するにはどうすればよいですか?
対話型のコマンド ライン プログラムを呼び出して、キーボードから直接入力する方法と、名前付きパイプから入力する方法を見つけようとしています。私の目標は、これを MATLAB で動作させることですが、Bash はサンプルと同じように機能すると思います。つまり、Bash を起動して実行すると、コマンドを入力したり、上向き矢印を使用して履歴を表示したり、名前付きパイプにコマンドを送信したりできます。私はこれを数日間見回していじっていましたが、これまで試したことは何もうまくいきませんでした.
たとえば、https://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linuxには、次のようなことを提案する役立つスレッドがあります。これ:
これは、バックスペースまたは矢印キーを使用しようとすると正しく機能しないことを除いて、私が探しているものとほぼ同じです。(これは、通常 bash の readline ライブラリによって処理されるキーストロークをインターセプトしているためだと思いcat
ますか?) 他の提案はありますか?
最終的には、MATLAB プロセスを起動して、TextMate からコマンドを送信できるだけでなく、ターミナルで操作できるようにしたいと考えています。私は仕事で MATLAB を使用していますが、その GUI やエディターはあまり好きではありません。
2010 年 12 月 19 日編集
すべての非常に役立つ提案をありがとう!興味のある方のために、この結果を要約したいと思います。を調べましrlwrap
たが、私の目標は誰でも使用できる TextMate バンドル内でこれを機能させることだったので、非標準のユーティリティ (最初に言及する必要があった) に依存することをためらっていました。私も簡単にチェックしましexpect
たunbuffer
が、まあ、かなり複雑に思えて、そこに飛び込む勇気がありませんでした.
screen
これは非常にうまく機能しました-以下に示すように、ターミナルを開いて start screen
、 startを実行すると、TextMate コマンドmatlab -nodesktop
を使用して、選択したテキストを Matlab に送信することができました。screen -X ...
私が気づいたこのアプローチの欠点は次のとおりです。
- 1,024 文字を超えるテキスト ブロックを送信すると、`screen` からエラーが発生しました。それ以上は保持できないバッファーがどこかにあると思いますが、それを追跡するのに時間をかけませんでした。
- 画面には独自のスクロールバック バッファがあるため、ターミナルのスクロールバーはほとんど役に立たなくなります。たぶん、これがどのように機能するかを変更するオプションがありますか?
- Control-A は `screen` のコマンド キーストロークです。コマンドキーを再バインドしない限り、行頭への移動には使用できません。
をいじっていscreen
たときに、私が尋ねた質問はパイプや STDIN などの接続に関するものでしたが、実際には、TextMate からターミナルにテキストを取得するという非常に特殊なケースについてのみ気にしていることに気付きました。そこで、AppleScript を使ってこれをやってみようと思ったのですが、驚くべきことに、それは私が試した他のどの方法よりも簡単で堅牢であることがわかりました。選択したテキストまたは現在の行を入力として取り、次を含む TextMate コマンドを作成します。
そして、MATLAB が最前面のターミナル ウィンドウにある限り、うまく機能します。(MATLAB を実行している [ターミナル] タブを検索することもできますが、わかりやすくするために除外しました。)
この話の教訓は、もっと具体的な質問をするべきだということです。ご協力ありがとうございました。私はこれと格闘することから多くのことを学びました!
c++ - c++ boost::interprocess 単純なアプリケーション
文字列オブジェクトを他のプロセスに渡す単純なアプリケーションをブーストで作成したいと考えています。コンパイルはうまくいきますが、2 番目のプロセスから文字列を出力しようとすると、次のメッセージがコンソールに表示され、2 番目のプロセスがクラッシュします。
../boost_1_44_0/boost/interprocess/sync/posix/interprocess_recursive_mutex.hpp:107: void boost::interprocess::interprocess_recursive_mutex::unlock(): アサーション `res == 0' が失敗しました。
最初のプロセス コード:
2 番目のプロセス コード:
アプリケーションを適切に動作させるにはどうすればよいですか?
sockets - プロセス間通信にソケットを使用する際の制限は何ですか?
Firefox で標準 ML (SML) をクライアント側プログラミング言語として使用できるようにする Firefox 拡張機能を作成しています。仕組みは次のとおりです。
- 拡張機能は、PolyML プロセス (最上位の対話型シェルを備えた SML コンパイラ) を起動します。
- 次に、拡張機能と PolyML プロセスの間でソケット通信が確立されます。
- SML コードは Web ページから読み取られ、評価のためにソケット経由で PolyML プロセスに送信されます。
- そのコードは、DOM を操作するために、私が提供するライブラリを使用する場合があります。
DOM ライブラリの実装方法は次のとおりです。
- 誰かが SML 関数 DOM.getElementById を実行するとします。
- このリクエストはソケット経由で拡張機能に転送され、そこで拡張機能はページ上で JavaScript 関数 getElementById を実行し、結果をソケット経由で PolyML プロセスに送り返します。
私の質問は、理論的には、ソケット通信に関しては、パフォーマンスの面でどのような制限があると予想する必要があるかということです。
非常に大まかなプロファイリングを行ったところ、拡張機能と PolyML の間でこのインターフェイスを使用すると、約2500 メッセージ/秒、平均サイズ70 バイト/メッセージを送信できるようです。
これをより具体的に説明すると、Canvas 要素を使用してブラウザーでいくつかのアニメーションを描画したいとします。20 fps を達成したい場合は、すべてのフレームを 0.05 秒で描画する必要があることを意味します。つまり、フレームごとに約 125 のメッセージしか送信できません。これらのメッセージは、JavaScript 関数呼び出しに対応しています。たとえば、以下のコードはパスを描画し、ソケット通信の 9 つのメッセージに対応する 9 つの JavaScript 関数呼び出しを行っています。
JavaScript は、明らかにパフォーマンスがはるかに優れています。フレームを描画するために、この 0.05 秒で数千 (数百) 回の Canvas/DOM 関数呼び出しを行うことができると思います。
それで、私の質問は、ソケット通信を使用して非常に高速なメッセージ交換を行った経験があるかということです。毎秒 2500 個の小さなメッセージ (この場合、毎秒 150 キロバイトに相当) が正しいように見えるのか、それとも非常に間違ったことをしている可能性があるのかを知りたいです。
たとえば、Firefox でのソケットの実装 (特に、JavaScript インターフェースhttps://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket経由での使用) は、この種の迅速な対話にはあまり適していないのではないかという疑いがあります。たとえば、ソケットからの読み取りは、イベント ループ メカニズムを介して行われます。つまり、私は Firefox に依存しています。着信ソケット メッセージの可用性について通知するため、メッセージの送信と受信の間に大きな遅延 (250 ミリ秒など) が発生することがあります (ただし、これは、Firefox が忙しくしているときにのみ発生するようです)。他のこと、そして私はソケット通信の..理論上の..制限にもっと興味があります)
アイデア、考え、欠陥はありますか? JavaScript や C への外部関数インターフェイス (JavaScript と PolyML の両方) からではなく、C++ XPCOM コンポーネントから私の通信を実装するパイプなど、他の IPC メカニズムを使用する方が良いと思いますか?
(興味のある方は、プロジェクトはhttps://assembla.com/wiki/show/polymlextにあります)
ruby - 2つのルビープロセス間の通信は可能/簡単ですか?
Daemon
名前が示すように、デーモンとして実行され、システムの一部を監視し、認証を必要とするコマンド(権限の変更など)を実行できるrubyスクリプトがある場合、2番目のrubyスクリプトを作成する簡単な方法はありますか?client
、そのスクリプトと通信してコマンドを送信する/情報を求める?私はこれを行うための組み込みのルビーの方法を探しています。ここで独自のサーバープロトコルを構築することは避けたいと思います。
java - Java での IO ストリームの使用
Java を使用してバイナリ ファイルを起動し、入力ストリームと出力ストリームを使用して対話する必要があります。それがどのように機能するかを理解するためにプロトタイプを作成しましたが、これまでのところ、得られた唯一の出力はnull
. ただし、単独で実行すると、子プログラムが出力を生成します。私は何を間違っていますか?
java - RMI サーバーで start rmiregistry を実行するのは良い考えですか?
Runtime.getRuntime().exec("start rmiregistry");
rmiregistry を自動的に開始するために RMI サーバーを配置するのは良い考えですか? それとも他の提案がありますか?
boost - boost::interprocess::message_queue を介してポインターを転送する
私がやろうとしているのは、アプリケーションAがアプリケーションBに、Aが共有メモリに割り当てたオブジェクトへのポインタを送信させることです( boost::interprocess を使用)。そのポインタ転送には、 を使用するつもりboost::interprocess::message_queue
です。offset_ptr
明らかに、A からの直接の生ポインタは B では有効ではないため、共有メモリに割り当てられたものを転送しようとします。しかし、それもうまくいかないようです。
プロセス A はこれを行います。
プロセス B はこれを行います。
私が見ているように、このようにして、プロセスBで彼を無効にするオフセットポインターのビットコピーを行います。これを正しく行うにはどうすればよいですか?
c# - プロセス境界を越えてアウトプロセス COM 参照をマーシャリングするにはどうすればよいですか?
物事を監視する必要があるアウトプロセス COM サーバーがあります。このサーバーはサービスとして実行され、内部的にはシングルトンです。簡単にするために、私は彼を BossCom と呼びます。
ワーカーである別のアウトプロセス COM サーバーがあります。システムの安定性を確保するために、これは使い捨てサーバーです (つまり、2 つの WorkerCom を作成すると、2 つの WorkerCom.exe が実行されます)。簡単にするために、私は彼を WorkerCom と呼びます。
WorkerCom は、誰かが適切なコマンド ライン引数を指定してコマンド ライン経由で実行した場合でも、単独で起動することもできます。
全体的な目標は、BossCom が周りの WorkerCom を把握し、彼らが何をしているかを把握し、彼らに命令 (一時停止、停止、立ち上げなど) を与えることができるようにすることです。
これに関する私の最初の考えは、WorkerCom が起動するたびに、BossCom を CoCreateInstance し、BossCom->RegisterWorker(IUnknown me) を呼び出すだろうというものでした。次に、WorkerCom がシャットダウンしようとしているときに、BossCom->UnregisterWorker(IUnknown me) を呼び出します。BossCom は、IWorkerCom の IUnknown を QueryInterface し、コマンドを発行できる可能性があります。
これらすべての com オブジェクトが同じプロセス内にある場合はうまく機能しますが、そうではありません。GlobalInterfaceTable を使おうと思ったのですが、単一プロセスという意味でグローバルなだけです。
私はこれを調査するのに数日を費やしましたが、途方に暮れています。多分私は視野狭窄です。
Worker から Boss への com オブジェクトへの参照をマーシャリングするにはどうすればよいですか?
ああ、それと、BossCom は C# で書かれており、WorkerCom は ATL C++ で書かれていますが、VB、Scala、Lisp などで書かれたソリューションを使用します。核となるアイデアを翻訳できると思います。:-)