- 締切済み
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 何か心当たりはありませんでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
><実行結果> >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ですべて異なるディスクリプタを返される事になります。