牛、豚、鶏、どれか一つ食べられなくなるとしたら?

現在、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


何か心当たりはありませんでしょうか?

A 回答 (1件)

><実行結果>


>Process A mqd = 10
>Process B mqd = 14

こうなって当たり前。

「2つの別々のプロセスで、同じファイルをopenした場合、同じファイル識別子は返って来ない」のは判りますか?

同様に「2つの別々のプロセスで、同じキューをmq_openした場合、同じキュー識別子は返って来ない」のは判りますか?

「プロセスAにとって、"/sample001"と言う名前のキューは10番である」
「プロセスBにとって、"/sample001"と言う名前のキューは14番である」
と言うように「別々の番号が返される」事によって、それぞれのプロセスがお互いを混同する事無く、キューにアクセス出来るのです。

もし、同じ番号が返って来たら、どうなると思いますか?

プロセスAでもBでも、どっちも「10」を返してきて、片方のプロセス、例えばプロセスAがmq_close(10)とかって感じでキューをクローズしちゃったら?

「もう、10番のキューは閉じちゃって使えない」のですよ。プロセスBは「ありゃりゃ。開いてた筈の10番のキューが全部エラーになる。なんで?」って事になってしまいます。

このように「もし同じディスクリプタが返される」としたら「誰がオープンして、誰がクローズしたんだか、混同して訳が判らなくなる」でしょう。

これを、キューじゃなく「普通のファイル」で考えてみて下さい。

「2つの別々のプロセスで、同じファイルをopenした場合、同じファイル識別子が返って来る」としたら?

当然「誰か一人がファイルを閉じた瞬間、全員が、そのファイルに(そのファイル識別子に、そのファイルディスクリプタに)アクセス出来なくなる」って事を意味します。

ファイルもキューも、それは同じです。

4つのプロセスが全員で1個のキューをオープンすると、4つとも、mq_openですべて異なるディスクリプタを返される事になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報