Boost Interprocessライブラリのメッセージキューを使用するいくつかのC ++コードを開発しており、正常に動作します。ただ楽しさと学習のために、「ipc」ボックスのメッセージキューを使用してRustの実行可能ファイルの1つを再実装しようとしています。
離れないでください! C ++アプリケーションからのメッセージはRustアプリケーションには届きません。いくつかのナビゲーションの後、Boostライブラリは次の場所にキューを作成したことを発見しました。/dev/shm
、Rustがipcで生成している間/dev/mqueue
!
それではコメントをください。メッセージキューを生成する「正しい」デバイスノードは何ですか?または、IPCライブラリはルートデバイスノードの指定を許可する必要がありますか?
答え1
デフォルトでは、共有メモリとメッセージキューは異なるタイプのIPCであり、異なる動作をします。必要なのはアプリケーションによって異なります。
共有メモリを使用すると、次の方法で両方のプロセスのアドレス空間にマッピングされるメモリ領域を作成できます。
handle = shm_open(Name /* '/dev/shm100' or similar*/, FLAGS);
/* now the memory can be mapped into address space */
address = mmap(0, SIZE, PROT, MAP_SHARED, &handle, 0);
それでも、セマフォなどを使ってメモリへのアクセスを同期させる必要があります。
一方、メッセージキューは通常のファイルのように書いて読み取ることができます。最大サイズと最大メッセージ数を考慮する必要があります。、sysctrlを介して設定できます。
fs.mqueue.msgsize_max = 9000
fs.mqueue.queues_max = 1024
送受信する呼び出しは次のとおりです。
mqd_t queue = mq_open(MQ_NAME, O_RDWR);
msg_size = mq_timedreceive(queue , request, SIZE, 0, (const struct timespec*) &my_timeout);
/* or */
int ret = mq_send(queue, (const char*) req, SIZE, 1);
mq_close(queue);