問題タブ [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.
cocoa - 別のプログラムのウィンドウに Cocoa の「シート」を投稿するにはどうすればよいですか?
Apple OS X Cocoa フレームワークを使用して、別のプロセスのウィンドウにシート(スライドダウン モーダル ダイアログ)を投稿するにはどうすればよいですか?
編集:少し明確に:
私のアプリケーションは、Subversion のバージョン管理を行うための Finder 拡張機能です ( http://scplugin.tigris.org/ )。私のアプリケーションの一部はプラグイン (Finder のコンテキスト メニュー項目) です。ただし、私のアプリケーションの大部分は別のデーモン プロセスにあります。いくつかの理由から、事実上すべてのコードをデーモンに入れることにしました。プラグインはメニュー自体のみを定義し、Apple-Events は Daemon に渡します。
デーモンは、ユーザーに詳細情報の入力を求める必要がある場合があります。このために画面上にウィンドウを投げることができますが、それは破壊的です (ランダムに配置されます)。ここでのワークフローは合法的にモーダルであるように思えます。たとえば、「ファイルを選択し、メニューから「コミット」を選択し、コミット コメントを提供します。 、操作を行ってください。」
プロセス間の連携 (ある種の参照を渡すなど) は許容されます。どちらのプロセスも私のものですが、シートのコードをプライマリ プロセスにバインドすることは避けたいと考えています。
select - Boost Message Queue not based on POSIX message queue? Impossible to select(2)?
I thought I'd use Boost.Interprocess's Message Queue in place of sockets for communication within one host. But after digging into it, it seems that this library for some reason eschews the POSIX message queue facility (which my Linux system supports), and instead is implemented on top of POSIX shared memory. The interface is similar enough that you might not guess this right away, but it seems to be the case.
The downside for me is that shared memory obtained via shm_open(3)
does not appear to be usable with select(2)
, as opposed to POSIX message queues obtained via mq_open(3)
.
It seems like Boost's library loses in this case. Does anyone understand know why this should be? Even if it POSIX message queues are only available on some systems, I'd expect Boost to use that facility where it is available, and reimplement it only where necessary. Is there some pitfall of the POSIX system which I do not yet recognize?
air - C プログラムからインプロセス共有ライブラリとして AIR ランタイムをロードする方法
java.exe の行に沿って、C で特別な AIR ランチャー プログラムを作成したいと考えています。
プロセス ビューアーを使用して AIR プログラムの実行を調べたところ、使用されている AIR ランタイム DLL を見つけることができました。AIR プログラムは、起動後に AIR ランタイムをインプロセス共有ライブラリとしてバインドするプラットフォーム固有の実行可能ファイルとしてインストールされるという点で Java とは異なります (ユーザーがアイコンをダブルクリックします)。
さて、代わりに java.exe のような AIR ランチャーを作りたいと思います。
java.exe は、インプロセス共有ライブラリとして Java JVM ランタイム (JRE) にバインドするプラットフォーム OS プロセスとして起動されます。実行する Java アプリケーションは、java.exe のコマンドライン引数として指定されます。java.exe が実行され、JVM が完全に機能するようになると、指定された Java アプリケーション クラスが実行のために JVM クラス ローダーによってロードされます。その指定された Java アプリケーションは、ある意味で java.exe のプロセスを「ハイジャック」します。もちろん、指定された Java アプリケーションは、それをホストする java.exe プログラムとしてすべてのプロセス リストに表示されます。
AIR アプリの起動をこのように動作させたいと考えています。なんで?そのため、AIR をハッキングする方法を探り、多くの欠点を克服することができます。たとえば、まず、実行中の AIR アプリケーションで使用できるようになるいくつかの新しい API を使用して、AIR ランタイム エクスペリエンスを拡張したいと考えています。
私の最初の注文は次のとおりです。
- .NET PInvoke に匹敵する ActionScript3 のバインディング インターフェイスを C に実装する
- これを行うための Java SE にある API (Runtime.exec、ProcessBuilder、Process) に匹敵するプロセス起動用の API を追加します。
- AIR アプリケーションのサポートを追加して、stdin、stdout、stderr と対話できるようにします。奇妙なことに、Adobe は AIR でのローカル ファイル アクセスのサポートを追加しましたが、これらの標準ファイル パイプとのやり取りを省略しました (ただし、AIR がサポートするすべての OS プラットフォームで検出されます)。
- stdin、stdout、stderr を介した AMF のサポートを実装します。これにより、AIR (または Java または任意の AMF 対応言語) アプリは、AMF オブジェクトの交換を介して通信を相互処理できます。これにより、Microsoft の PowerShell のタッチが AIR に追加されます。
現在、Merapi は Java との AMF ブリッジを提供しているため、これの有効性が実証されています。悲しいかな、Merapi はプロセス間通信を行うためにローカルホスト ポートとソケットを使用する必要があります。
c - 親子IPCにCでパイプを使用するとプログラムがブロックされる
ソケット接続を受け入れるときに fork() が子プロセスからオフになるサーバーを作成しています。
子がクライアントと通信するとき、その情報の一部を親に送り返す必要があります。これを実現するためにパイプを使用しています。
問題は、親子 IPC を実行しようとすると、子からの入力を読み取るときに親がブロックすることです。つまり、子が同時に実行されていても、それらはすべて親を待っているため、一度に 1 つずつしか処理できません。
私のコードは次のようになります(簡潔にするためにエラーチェックは削除されています):
だから私の質問は、どうすればこれを解決できますか? ブロックされないように、親がパイプを使用して子と通信するにはどうすればよいですか?
これはパイプでも可能ですか、それとも代わりに共有メモリ(セマフォを使用すると思います)またはメッセージキューを使用する必要がありますか? (この投稿を読みました: Unix/Linux IPC の比較ですが、これらのタスクが実際にどのように達成されるかの例を見つけるのは非常に困難です。)
詳細:
次のことを行うテスト プログラムがあります。 1. サーバーに接続する 2. スリープ(5) 3. サーバーから切断する
このプログラムの 2 つのインスタンスを実行すると、サーバーは次のように出力します。
明らかに、各クライアントを一度に 1 つずつ処理します。
IPC を削除すると、親と子の両方からパイプ read() と write() を削除すると、次のようになります。
これは私が欲しいものです!
これを達成する方法について何か考えはありますか?(または、この問題を解決しようとしている方法を変更する必要がありますか?)
(編集: これはネットワーク クラスの課題の一部です。集中型サーバーを使用してピアを管理する P2P プロトコルを実装しています。任意の言語を使用できますが、C で試してみようと思いました。)
c++ - boost::vector と boost::matrix の割り当て戦略を動的に変更する
私の新しいプロジェクトでは、データ管理モジュールを構築しています。単純なテンプレート ストレージ タイプを上位層に提供したいと考えています。
私の目的は、Boost.inter プロセス アロケーターや Boost.pool アロケーター (Boost Ublas Matrix および vector クラスはアロケーターをテンプレート パラメーターとして受け取る) のようないくつかの異なるアロケーターでデータのアロケーターを変更することです。カバーの下の適切なアロケータ.仮想基本クラスは素晴らしいかもしれませんが、テンプレートでそれを使用する方法を処理できませんでした.どのようなデザインパターンまたはソリューションを提供していますか?
編集:
私はboost.poolとboost.shared_memory_allocatorを使用します.簡単に言えば、異なる割り当て戦略を持つ異なるクラスが必要です.しかし、私のポイントは、プログラムの上部にはそれについての知識がないはずです.同一の基本クラス。
編集:カスタムアロケータでマトリックスクラスを使用したい人向け。
それはこのようなものです:
c++ - Windows XP でプログラム + DLL を複数回起動すると問題が発生しますか?
TCP および UDP ソケットを使用するネットワーク ライブラリを開発します。この DLL は、負荷テストのために同じ PC で複数回起動されるテストクライアントによって使用されます。
Windows Vista では、testclient を何度も起動しても問題ありません。Windows XP では、5 回まで起動しても問題ありませんが、6 回以上起動してから 1 つのクライアントを閉じると、それらすべてが明らかにランダムなスタック トレースでクラッシュします。
はい、プロセス間コード (クライアント間のソケットのみ) を使用していませんが、クライアントの 1 つが終了すると、すべてのクライアントがクラッシュします。
当社の DLL は MSVC でコンパイルされ、Boost および Crypto++ ライブラリ (静的にリンク) を使用します。
さまざまなプロセスが互いに影響を与える可能性がある理由について何か考えはありますか?
tcp - ローカルTCP/IP接続またはプロセス間通信の2つのプロセス間で画像のストリームを送信するには、どちらの方法が適していますか?
ストリーム上の各画像をコピーする必要があると仮定すると(ミューテックス保護を使用してそのデータに単純にアクセスすることはできません。とにかくコピーする必要があります)、どちらの方法が優れていますか、長所と短所はありますか?
同じプロセスで画像を使用した場合と比較して、これがどの程度のパフォーマンスの低下を意味するかも知りたいです。
ありがとう
c++ - ブースト、共有メモリ、ベクトル
プロセス間で文字列のスタックを共有する必要があります (将来的にはより複雑なオブジェクトになる可能性があります)。boost::interprocess を使用することにしましたが、動作させることができません。きっと何かわからないからだと思います。私は彼らの例に従いましたが、そのライブラリを使用した経験のある人が私のコードを見て、何が問題なのか教えていただければ幸いです。問題は、動作しているように見えますが、数回繰り返した後、リーダー プロセスとライター プロセスの両方であらゆる種類の例外が発生することです。これが私の実装の簡略版です。
編集named_mutex を使用するように編集されました。元のコードは正しくない interprocess_mutex を使用していましたが、それは問題ではありませんでした。
EDIT2また、物事はある程度まで機能することに注意する必要があります。ライター プロセスは、リーダーが中断する前に、いくつかの小さな文字列 (または 1 つの非常に大きな文字列) をプッシュできます。行 m_stack->begin() が有効な文字列を参照していないという方法で、リーダーが中断します。ゴミです。そして、さらに実行すると例外がスローされます。
EDIT3 std::stringではなくboost::interprocess::stringを使用するようにクラスを変更しました。それでもリーダは無効なメモリ アドレスで失敗します。リーダー/ライターはこちら