thumbnail 一問一答の一歩

前提:キューとスタックについて

キューやスタックは基本情報で出てくるが、どちらもデ-タの保存方法と取り出し方を示したものである。具体的な違いをあげると以下の通りです。

  • ・キュー……最初に入れたデ-タから順番に取り出す。
  • ・スタック……直近に入れたデ-タから順番に取り出す。

STEP1メッセージキューとは

そんなデータの保存と取り出し方をしましたキューですが、プログラム作成においては別のプログラムファイル間、又は別の機器の間でメッセージをやり取りを行う「メッセージキュー」という形で使用されます。

メッセージキューとは何かをイメージしやすくするより詳しい説明は下記のリンク先にあったので参考にするとよいでしょう。

※以下、広告リンクです。

STEP2メッセージキューのプログラムについて

メッセージ実装するためには以下のプログラムを別々に作成する必要があります。

  • ・送信用のプログラム
  • ・受信用のプログラム

※なお、言語とOSに関しては以下のものを前提としています。

  • ・OS:linux
  • ・言語:C言語

そして、それぞれのプログラムの概要と必要となるメッセージキュー関数を述べると以下の通りです。

○メッセージ送信用のプログラム

  1. msgget関数……メッセージを入れるためのメッセージキューIDを確保する
  2. 確保したメッセージキューIDにメッセージを入れる
  3. msgsnd関数……値を入れたメッセージをメッセージキューとして送信する

○受信側のプログラム

  1. msgget関数……メッセージを入れるためのメッセージキューIDを確保する
  2. msgrcv関数……指定したメッセージキューIDに保存してあるメッセージを取り出す
  3. printf関数を用いて、受信したメッセージの内容を表示する
  4. msgctl関数……指定したIDのメッセージキューに対する操作(ここでは削除)を行う

メッセージキューの具体的なサンプルとなるものとしては以下の二つがあるので、詳細については参考にしてみるといいでしょう。

※また、上記サイトのサンプルプログラムに記載されているgets関数は廃止されているので以下のリンクのように対応する必要があります。

STEP3メッセージキューのプログラムの確認の仕方

メッセージキューの実行が正しくできているかの確認は一つのプログラムを動かして終わるものではなく、大枠としては以下の順番で実行をする必要があります。

  1. 送信用プログラムを実行
  2. 共有メモリを表示することで確認
  3. 受信用プログラムで実行

この順番をとる理屈としては以下の通りです。

まず、メッセージキュー自体が、別のプログラムファイルにメッセージ形式の情報を送るために使用されているので、送信したファイルと同じファイルでは基本的に受信は行いません。

そのため、はじめに送信用プログラムを実行することによって、全プログラムファイルの共有メモリ上のメッセージキューにメッセージが保存がされます。

そのため、送信を終えた段階ではメッセージキュー上に保存してあるデータを確認する以下のコマンドを打てば良いです。

ipcs

IPCSコマンドを打つと保存してあるすべてのメッセージキューの情報が出てくるので、保存データが存在することを確認します。

ipcsコマンドによってデータが存在していることを確認できたら、次に保存しているデータが正しいものであることを確認する必要があります。

そのために、受信用のプログラムを実行します

リンクに示したメッセージ受信用のサンプルのプログラムにprintf関数が着いてあるため、表示されるメッセージの具体的な内容から正しいデータであることを検証できます。メッセージにprintf関数が着いていればメッセージの内容が正しいかも合わせて検証できます。)