• 締切済み

プロセス間でのメッセージキュー送信

Linux初心者です。 あるプロセスが生成したメッセージキューへ、別のプロセスからメッセージキュー送信する場合、キューIDを指定する必要があります。 しかし、Linuxでは仮想メモリを使用しているため、共有メモリにアクセスできないはずで、異なるプロセス間でキューIDを共有する方法がわかりません。。 メッセージキューについて以下のサイトでサンプルプログラムが紹介されていますが、2つのプロセスが親子関係であるため、キューIDを共有できています。 http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml そもそも、親子関係がないとプロセス間通信ができないのでしょうか? ご存知の方、よろしくお願いします。

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> メッセージキューIDはキュー生成時にシステムが自動で割り当てる(=msgget()の戻り値)ために、設計者が自由に決めることができない認識ですが 正確でない表現をしてしまいました。 正しくは「作成者と利用者が同じkeyでmsgget()し、返ってきたIDを利用する」です。 keyとキューは1:1の対応(IPC_PRIVATE除く)なので、同じkeyを使えば同じキューが参照できます。

kurombo
質問者

お礼

理解できました。 同一のIPCキー(key_t)からは、同一のIPC識別子が得られるのですね。 ありがとうございました。 助かりました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

・ID固定でメッセージキューを作成する ・作成者がファイルにIDを書き込み、利用者がファイルからIDを読み取る ・CORBAなどのRPCを使ってIDをやりとりする ざっと思いつくのはこれくらいですね。

kurombo
質問者

補足

ご回答ありがとうございます。 >・ID固定でメッセージキューを作成する についてですが、メッセージキューIDはキュー生成時にシステムが自動で割り当てる(=msgget()の戻り値)ために、設計者が自由に決めることができない認識ですが誤りでしょうか? すいませんがよろしくお願いします。

関連するQ&A

  • linuxにてプロセス間通信をメッセージキューに行いたいのですが、

    linuxにてプロセス間通信をメッセージキューに行いたいのですが、 ある条件のときにキューに溜まったメッセージを削除したい場合はどのようにしたらいいでしょうか?

  • 異なるプロセスですでに開かれているキューのオープンができません

    現在、Linux(Suse10.3)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューのオープンができません。 最初にオープンしたキューは受信専用、異なるプロセスでオープンするキューは送信専用です。 errnoを調べましたが、 EACCES("\nキューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープンする許可を持たない。")となっています。 プロセスAの第3引数についてはmode_t S_IRWXU=0x777;としていますが、この辺りの設定方法がよくわかりません。 例) <プロセスA(プロセスBより先に実行)> msqid = mq_open(   "/sample001", O_RDONLY | O_CREAT, S_IRWXU, &mqattr); cout << "msqid:" << msqid << enld; msqid:3 <プロセスB> mqd = mq_open("/sample001", O_WRONLY); cout << "msqid:" << msqid << enld; msqid:-1 ///////////////////////////////////////////////////////////// //errnoは下記の通りです。 ///////////////////////////////////////////////////////////// EACCES(キューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープ>ンする許可を持たない。) 何か心当たりはありませんでしょうか?

  • メッセージキューのスレッド間通信 

    linuxは全くの初心者なんですが、仕事でメッセージキューでスレッド間通信をするツールを作成するよう指示を受けたのですが全くわかりません。プロセス間通信をするツールは調べて何とかなったんですが… そもそもスレッド間通信ということがわからず困っていますので、ご教授願います。 簡単ものでいいのでツールについても教えていただけたら幸いです。

  • メッセージキュー一括削除の方法

    LINUXプログラムの開発で、バグがありプログラムが暴走してしまい、CTRL+Cで強制的に止めた際、使用していたメッセージキューがそのまま残ってしまうことがままあります。 現在はipcsコマンドで残っているキューのIDを確認してから、ipcrmコマンドでいちいちIDを入力して消しております。 一括して簡単にキューを削除できる良い方法が他にあるのでしょうか。 ご存知の方教えて頂けないでしょうか。 よろしくお願いします。

  • POSIX メッセージキュー作成時の払い出しディスクリプタ

    現在、Linux(Fedora 7)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューをオープンした時に、 最初にオープンしたキューと異なる値のディスクリプタが払い出されてしまいます。(その際のディスクリプタの値は他のキューの値になっていたりもします。) 例) <プロセスA(プロセスBより先に実行)> mqd = mq_open(   "/sample001", O_RDWR|O_CREAT, S_IRWXU, &mqattr); printf("Process A mqd = %d", mqd); <プロセスB> mqd = mq_open("/sample001", O_RDWR); printf("Process B mqd = %d", mqd); <実行結果> Process A mqd = 10 Process B mqd = 14 何か心当たりはありませんでしょうか?

  • LINUXのプロセス間通信について

    共有メモリを利用したプロセス間通信とメッセージを利用したプロセス間通信のメリットとデメリットを教えて下さい。

  • linux_ メッセージキューの使用方法

    よろしくお願いします。 メッセージキューの使用方法に関して、とても頭を痛めております。 使用しているOSはLINUX DEBIAN4.0 コンパイラはGCCです。 簡単に申し上げますと、メッセージキューで送信する構造体の構造体の構造体のメンバの値が取得できず、取得しても0になってしまうところです。 ちなみに構造体の形は typedef struct { long mtype; <- 1を代入 uint16 command; <- 選別子として仕様 uint16 length;  <- 問題としていない uint16 number;  <- 問題としていない T_BUFF buff; <----------- ここが問題 } aaa; このT_BUFFの構造体の中身は typedef union _T_EngBuf { uint8 buff[32]; uint8 bbb[256]; uint8 ccc[256]; T_DDD ddd; T_EEE eee; T_FFF fff; T_GGG ggg; T_HHH hhh; T_JJJ jjj[**]; } T_BUFF; この中の各構造体のメンバの値が取得できないのです。 しかしながら、buf[32]やbbb[256]といった配列に関してはちゃんと取得できます。 ちなみに送受信のサイズ、キューID、sndとrcvとgetの文法はあっていると思います。 共有体をもちいてはメッセージの送受信はできないのでしょうか? もし可能だとしたら、共有体での送受信の方法を教えてください。 よろしくお願いします。

  • Linuxでのスレッド間メッセージについて

    Linuxでスレッドを複数生成し、スレッド間でメッセージのやり取りをしたいと思っています。 ネットで色々検索したのですが、欲しい情報にめぐり合えていません。 # WindowsのPostThreadMessage()みたいなものを探しています。 #「プロセス間通信」というものは発見しましたが・・・ 何か方法はありますでしょうか? スレッド間のメッセージのやり取りの方法がない場合は代替案も教えて頂きたいです。 # セマフォを用いて共有メモリアクセスかな?と思っています。

  • プロセスIDの再利用

    こんちにちは、honiyonです。  親子関係のない全く別々に起動されたプロセスの終了するプログラムを作ろうと思います。  .NETではシステムで一意なIDというものがある、という情報を見かけたのですが、.NETは使用したくないのでプロセスIDを使って監視出来ないかと考えています。  プロセスIDを使って、定期的にポーリングする方法をとったとき、 プロセスIDが再利用されてしまう事で終了を検知出来ない事があるのではという疑問が出てきました。  UNIXでは極力重複しない(再利用しない)という方針があるようですが、Windowsではそのような仕組みはありますでしょうか?  そのような仕組みがあれば、再利用による検知ミスは無視出来るレベルの問題かなと考えています。    また、プロセスIDでの監視以外で良い手段がありましたら、是非ご教授頂ければ幸いです。  宜しくお願いします(..  

  • Linuxでの自分が起動しているプロセスの確認法

    Linux(release 4 (Nahant Update 8))を共有ユーザーで使用しています。こういったケースで使用しているツールが時折ハングるのでpsコマンドでプロセスIDを確認してKILLしています。複数の人間が同時に使用している可能性があるのでいつも自分が起動しているプロセスを探すのに苦労します。自分 が起動しているプロセスを探すいい方法はないでしょうか?