メッセージキューを使用したIPC
共有メモリがすでにあるのに、なぜメッセージキューが必要なのですか?それは複数の理由によるでしょう、単純化するためにこれを複数のポイントに分割してみましょう-
-
理解されているように、メッセージがプロセスによって受信されると、他のプロセスでは使用できなくなります。一方、共有メモリでは、データは複数のプロセスがアクセスできるようになっています。
-
小さなメッセージ形式で通信したい場合。
-
複数のプロセスが同時に通信する場合は、共有メモリデータを同期で保護する必要があります。
-
共有メモリを使用した書き込みと読み取りの頻度が高い場合、機能の実装は非常に複雑になります。この種の場合の利用に関しては価値がありません。
-
すべてのプロセスが共有メモリにアクセスする必要はないが、共有メモリのみを必要とするプロセスが非常に少ない場合は、メッセージキューを使用して実装する方がよいでしょう。
-
異なるデータパケットと通信する場合、たとえば、プロセスAがメッセージタイプ1をプロセスBに、メッセージタイプ10をプロセスCに、メッセージタイプ20をプロセスDに送信しているとします。この場合、メッセージキューを使用して実装する方が簡単です。指定されたメッセージタイプを1、10、20として単純化するために、以下で説明するように、0、+ ve、または–veのいずれかになります。
-
もちろん、メッセージキューの順序はFIFO(先入れ先出し)です。キューに挿入された最初のメッセージは、最初に取得されるメッセージです。
共有メモリまたはメッセージキューの使用は、アプリケーションのニーズと、アプリケーションをどれだけ効果的に利用できるかによって異なります。
メッセージキューを使用した通信は、次の方法で発生する可能性があります-
-
あるプロセスによる共有メモリへの書き込みと、別のプロセスによる共有メモリからの読み取り。私たちが知っているように、読み取りは複数のプロセスでも実行できます。
異なるデータパケットを使用する1つのプロセスによる共有メモリへの書き込みと、複数のプロセスによる読み取り(つまり、メッセージタイプごと)。
メッセージキューに関する特定の情報を確認したら、メッセージキューをサポートするシステムコール(System V)を確認します。
メッセージキューを使用して通信を実行するには、次の手順に従います-
ステップ1 −メッセージキューを作成するか、既存のメッセージキューに接続します(msgget())
ステップ2 −メッセージキューに書き込む(msgsnd())
ステップ3 −メッセージキューから読み取る(msgrcv())
ステップ4 −メッセージキューで制御操作を実行します(msgctl())
ここでは、2つのプロセスを作成します。 1つは書き込み可能で、もう1つは読み取り可能です。リーダーとライターのプロセスが共有メモリを使用してどのように機能しているかを見てみましょう。
サンプルコード
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // structure for message queue struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id message.msg_type = 1; printf("Write Message : "); fgets(message.msg, 100, stdin); msgsnd(msg_id, &message, sizeof(message), 0); //send message printf("Sent message is : %s \n", message.msg); }
サンプルコード
#include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h> // Define message queue structure struct msg_buffer { long msg_type; char msg[100]; } message; main() { key_t my_key; int msg_id; my_key = ftok("progfile", 65); //create unique key msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message // display the message printf("Received Message is : %s \n", message.msg); msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue return 0; }
出力
-
C++で二重にリンクされたリストを使用した優先キュー
データと優先度は整数値として与えられ、タスクは与えられた優先度に従って二重にリンクされたリストを作成し、結果を表示することです。 キューはFIFOデータ構造であり、最初に挿入された要素が最初に削除されます。優先度付きキューは、優先度に応じて要素を挿入または削除できるキューの一種です。キュー、スタック、またはリンクリストのデータ構造を使用して実装できます。優先キューは、次のルールに従って実装されます- 優先度が最も高いデータまたは要素は、優先度が最も低いデータまたは要素の前に実行されます。 2つの要素の優先度が、順番に実行される要素と同じである場合、それらはリストに追加されます。 優先
-
Truecallerを使用してメッセージをスケジュールする方法
誰かの誕生日を忘れた後悔に対処しなければならなかったことがありますか?現実には、あなたは結局のところ人間であり、時にはあなたはあなたの愛する人の日付でさえ、重要な日付を忘れます。 幸い、Truecallerを使用すると事前にメッセージを送信できるため、特別な機会を忘れる必要はありません。 Truecallerは、主に発信者の識別とスパム番号のブロックに役立つ人気のアプリですが、通話録音、チャット、ボイスメッセージング、メッセージのスケジュール設定などの機能も提供します。 ここでは、Truecallerを使用してメッセージをスケジュールする方法について説明します。 Truecallerでメ