Linuxメッセージ・キューの実行プロセス間の通信例の詳細


Linuxメッセージ・キューの実行プロセス間の通信例の詳細
一、メッセージキューとは?
メッセージキューは、プロセスから別のプロセスにデータブロックを送信する方法を提供する。  各データブロックは、1つのタイプを含むと考えられ、受信プロセスは、異なるタイプのデータ構造を含む独立して受信することができる。メッセージを送ることによって、ネーミングパイプの同期とブロッキング問題を回避することができます。しかし、メッセージ・キューは、命名されたパイプと同じで、各データブロックに最大の長さの制限がある。
Linuxは、マクロMSGMAXとMSGMNBを使用して、メッセージの最大長さと1つのキューの最大長さを制限する。
二、Linuxでメッセージキューを使う
Linuxは、プロセス間の通信を容易にするために、一連のメッセージ・キューの関数インターフェースを提供する。その使用法は他の2つのSystem V PIC機構、すなわち信号量と共有メモリと類似している。
プロセス間通信(IPC):プロセス間通信の本質は、異なるプロセスに共通のリソースを見せて通信を実現することである。
一般的なプロセス間通信の方式は2つあります。パイプとsystemv規格を通して、今日はsystemv標準の一つを紹介します。
メッセージ・キュー:メッセージ・キューは、1つのプロセスから別のプロセスにデータ・ブロックを送信する方法を提供し、各データ・ブロックは、1つのタイプがあると考えられ、受信者プロセスが受信したデータ・ブロックは異なるタイプの値を持つことができる。メッセージを送ることによって、ネーミングパイプの同期とブロッキング問題を回避することができます。
特徴:
(1)メッセージ・キューは、グローバルのチェーンと考えられ、メッセージ・キュー識別子によって識別される。
(2)メッセージ・キューは、1つ以上のプロセスにメッセージを書き込みまたは読み込みできるようにする。
(3)メッセージキューの宣言周期はカーネルに従う。
(4)メッセージ・キューは双方向通信を実現することができる。
メッセージキューを作成します。msget()
这里写图片描述
最初のパラメータ:メッセージキューごとに一意のkey値があります。ftk()によって生成されます。
第二のパラメータ:一般的に2つのオプションでIPC_CREATとIPC_EXCLは、単独でipc_を使用します。creatの場合、メッセージキューが存在しない場合は作成し、存在する場合はIPC(u)を開きます。EXCLを同時に使用すると、メッセージキューが存在しない場合に作成され、存在する場合にエラーが発生します。IPC_を単独で使用する場合EXCLの時、意味がありません。
ftk:
这里写图片描述
パラメータはユーザによって指定できます。
メッセージキューの作成はコードで行います。
メッセージキュー(他のipcと同じ)を作成するには、ファイルパス名とプロジェクトIDを介してキー値を取得し、このキー値を介してカーネルから識別子を生成し、後でこの識別子でこのメッセージキューを使用することができます。
这里写图片描述
なぜkey値と識別子の2つの値が必要ですか?
記述子は、ユーザの操作に対して、ファイルの操作と同じ操作をユーザに感じさせるものであり、keyはシステム内部について説明するものである。
私たちはftkを使ってkey値を作成します。具体的にはfotk関数をマンマンマンしてもいいです。大体、与えられたパス名でそのstat構造を取得して、この構造から一部のst_を取り出します。devとst_inoフィールドは、2つのパス名が2つの異なるファイルを参照すると、この2つのパス名に対してftkを呼び出すと、通常は異なるkey値に戻りますが、i節ポイント番号とkeyは通常、長い整数に保存されていますので、keyを作成するときに情報を失うことができます。異なるファイルの2つのパス名に対して同じkey値が生成され得る。識別子は一意に決定され、他のipcと区別するために使用されることができる。
削除メッセージキュー:msgctl()
这里写图片描述
コードの実装:
这里写图片描述
メッセージ送信:msgsnd()
受信メッセージ:magrcv()、この2つの関数はプロセス間の双方向通信を実現する。
这里写图片描述 
パラメータ:msqid-メッセージキュー識別コード
msgp-メッセージバッファのポインタを指します。この位置は送信及び受信のメッセージを一時的に記憶するためのもので、ユーザが定義できる汎用構造です。
msgtyp-メッセージキューから読み込むメッセージ形態。値が0であれば、メッセージキューにおいてすべてのメッセージが読み取られることを示す。
msgsz:メッセージのサイズ
戻り値:成功は0を返し、失敗は-1を返します。
这里写图片描述
システムで実行中のメッセージの列はどうやって調べますか?
二つのコマンドを紹介します。ipcs-qはメッセージのキューを確認します。
ipcrm-q msgidはこのメッセージキューを削除します。
这里写图片描述
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。