現在、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件)
- 最新から表示
- 回答順に表示
No.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ですべて異なるディスクリプタを返される事になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
AppActivate関数について
-
ADOでアクセスのレコードに...
-
プロセスIDの取得方法について
-
親子プロセス間でのデータの受...
-
C#でのbatファイル実行結果取得
-
VBS(WSH)で開いたIEのウィンド...
-
Linuxでのスレッド間メッセージ...
-
シェルで親プロセス終了時に子...
-
ウィンドウのタイトルからプロ...
-
c言語でプロセスIDを調べたい
-
プロセスIDからウィンドウハ...
-
非表示になったエクセルは?
-
API関数 GetExitCodeProcess
-
IISがフリーズ
-
VBAで別プロセスのExcelのフル...
-
プロセスのアタッチ・デタッチ...
-
他のアプリケーションの起動と...
-
ファイルの書き込みOpen中に、...
-
explorer.exeが異様にメモリを食う
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
プロセスのアタッチ・デタッチ...
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
ADOでアクセスのレコードに...
-
プロセスIDの取得方法について
-
explorer.exeが異様にメモリを食う
-
セマフォとmutexの違いは?
-
Windowsでのfork方法
-
プロセスIDからウィンドウハ...
-
VB6.0 SHELLで起動...
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
ウィンドウのタイトルからプロ...
-
怪しいプロセス教えてください。
-
シェルで親プロセス終了時に子...
-
【C#】別プロセスがロックか...
-
API関数 GetExitCodeProcess
-
Linuxでのスレッド間メッセージ...
おすすめ情報