現在、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で質問しましょう!
似たような質問が見つかりました
- 英語 この文の訳し方について教えてください 3 2023/02/06 11:27
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 不安障害・適応障害・パニック障害 認知療法について 1 2022/09/14 20:20
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 哲学 真実の信仰=真理の探究 1 2022/11/26 09:03
- 歴史学 山上徹也、「山上家」の家系や先祖、一族の調査はしてますか? 4 2022/07/11 23:39
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
C#でのbatファイル実行結果取得
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
起動しているプロセスの確認
-
タスクマネージャーのプロセス...
-
プロセスIDの取得方法について
-
Trend Micro Anti-Malware Solu...
-
VB6.0 SHELLで起動...
-
子プロセスのデータを親プロセ...
-
シェルで親プロセス終了時に子...
-
OSPFでプロセスを分ける意義に...
-
Process.Startの戻り値を後で取得
-
プロセスの停止
-
VBS(WSH)で開いたIEのウィンド...
-
IISがフリーズ
-
vb.netでEXCEL起動がうまくでき...
-
Windowsでのfork方法
-
Windowsで環境変数を設定できま...
-
完全な乱数を生成する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
C#でのbatファイル実行結果取得
-
explorer.exeが異様にメモリを食う
-
プロセスのアタッチ・デタッチ...
-
タスクマネージャーのプロセス...
-
怪しいプロセス教えてください。
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
ADOでアクセスのレコードに...
-
Windowsでのfork方法
-
他のコンピュータのプロセスを取得
-
プロセスIDからウィンドウハ...
-
SendMessageが失敗するときがある
-
プロセスが実行中かどうか調べ...
-
IISがフリーズ
-
ロードアベレージが高いのです...
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
API関数 GetExitCodeProcess
-
別のプロセスの関数を呼び出す...
おすすめ情報