Linux IPC-複数のライター、単一のリーダー
-
07-07-2019 - |
質問
これまでにLinuxでIPC C ++を書いたことがありません。
私の問題は、複数のクライアント(ライター)と1つのサーバー(リーダー)を持っていることです。これらはすべて同じマシン上にあります。ライターは、データの塊(文字列/構造体)をリーダーに配信します。リーダーはFIFOでそれらを読み取り、それらで何かを行います。
LinuxでのIPCのタイプは、私が知る限り、パイプまたはソケット/メッセージキューです。
私は、誰かが私に降りる道を勧めてくれるかどうか疑問に思っていました。私はソケットに傾いていますが、それに対する本当の根拠はありません。この旅に出る前に読んで理解すべきことはありますか?
ありがとう
解決
考慮する必要がある主な問題は、渡すデータの種類です。これにより、オプションがある程度決まります。これは、データが制限されているかどうかにかかっています。境界が設定されていない場合、FIFOやソケットなどのストリーム指向のものが適切です。その場合は、MQや共有メモリなどをより有効に活用できます。文字列と構造体の両方に言及しているため、あなたの場合に適切なものを言うのは難しいですが、文字列が合理的な最大値内に制限されている場合は、多少の手間をかけたものを使用できます。
2番目は速度です。これに対する完全な正解はありませんが、一般的には、共有メモリ、MQ、FiFO、ドメインソケット、ネットワークソケットのようになります。
3番目は使いやすさです。共有メモリは、独自の同期を処理する必要があるため、最大のPITAです。メッセージの長さがPIPE_BUFサイズを下回っている限り、パイプは簡単です。 OSは、MQで頭痛のほとんどを処理します。ソケットは簡単ですが、セットアップの定型文があります。
最後にいくつかのIPCメカニズムには、POSIXとSYSVの両方のバリアントがあります。一般に、POSVは、SYSV型に本当に必要な機能または必要な機能がない限り、使用する方法です。
編集:Count0の答えは、もっと抽象的で高いレベルのものに興味があるかもしれないことを思い出させてくれました。 ACEに加えて、 Poco を見ることができます。そして、もちろん、どこかでブースト。
他のヒント
System V IPCはやや使いにくいですが、成熟した堅牢なテクノロジーです。メッセージキューはおそらく、必要な処理を行い、アトミックキューイング/デキューイングをサポートします。
ソケットは使いやすく、ネットワーク経由の通信もサポートしています。ただし、キューイングは行われないため、サーバー内でキュー管理コードを作成する必要があります。 C ++でソケットを使用することは、Cでソケットを使用することと大きな違いはありません。このトピックについては、ネット上や、Stevensの「Unix Network Programming(vol 1)」などの本である程度掘り下げたガイドがたくさんあります。
足を濡らすのに適した場所は、このソケットチュートリアルです。
その後、スレッド&でボーンアップする必要があります。ミューテックスおよびこちら。
>これで、プレイを開始する準備が整いました;-)
本を求めていませんが、上記の答えは非常に良いので、これらの2つの本のコピーを手に入れることをお勧めします。
UNIXネットワークプログラミング、第2巻、第2版:プロセス間通信、W。リチャードスティーブンス
UNIX環境の高度なプログラミング、第2版、W。リチャードスティーブンス、スティーブンA.ラーゴ
避けられない問題があります&この種のコーディングでは、これらの2冊の本は、あなたが遭遇する混乱を乗り切るのに役立ちます。
ACE (Adaptive Communication Environment)をご覧ください。 。 ACEライブラリは無料で入手でき、非常に成熟したクロスプラットフォームです。残念ながら、良いドキュメントはありません。この本を探して、良い解決策。取得するには、このチュートリアルをご覧ください。パターンの感触(ドキュメントの最後)。 ACEは多数のパターンを使用して、特にネットワーク化されたコンテキストでこれらの問題を非常にうまく処理し、効率的に処理するため、適切なパターンと使用方法のスコープを開始するのに適しています。
特に Ace_Task を使用して Message_Queue を使用すると、必要な処理を実行できます。