2016-10-25 41 views
1

、 我々はmsqidが一意のキュー識別子ですの場合、キーは何であるmsgget()システムコールシステムv IPCの「キー」とは何ですか? System Vメッセージキューで

int msqid = msgget(key, 0666 | IPC_CREAT); 

を使用してメッセージキュー識別子を取得しますか?ユニークなキュー識別子でもないのですか?

すべてその人のページが、この

であると言いmsgget()システムコールはkey引数

の値に関連付けられたシステムVメッセージキューの識別子を返すものの何の説明はありませんそのキーは実際には。それは値がIPCツールの束である何らかのハッシュテーブルの鍵ですか?私はthisの記事を読んだが、まだまだ泥だ。

また、人々は一般的にftok()を使用してキーを生成します。

key_t ftok(const char *pathname, int proj_id); 

ftok()関数は、(既存の、アクセス可能なファイルを参照しなければならない)指定されたパス名で指定されたファイルと(非ゼロでなければならない)PROJ_IDの最下位8ビットのアイデンティティを使用しkey_t型System V IPCキーを生成する

なぜ、誰かがファイルのiノードをハッシュして一意の番号を生成したいのですか?個人的には、共通のファイルに同意するすべてのプロセスよりも、共通の番号に同意するすべてのプロセスを実装する方が簡単だと思います。 this回答の状態が一様な配布目的のためだけですか?

+0

"msqidが一意のキュー識別子である場合、そのキーは何ですか?一意のキュー識別子でもありませんか?" 'msqid'はプロセス内でのみユニークです。 'key'はグローバルにユニークです。 – kaylum

答えて

0

固定番号に同意することも、固定ファイルに同意することも、衝突のために実用的ではありません。キーのネームスペースは、システム全体が小さくてすみます。実際には、キーをランダムに生成する必要があります(キーがすでに存在する場合は新しいランダムな値で再試行します)。別のチャネルを使用してキーを伝える必要があります(ファイルに保存するか、コマンドラインや何らかのメッセージを渡すなど)。

+0

次に、ftokの目的は何ですか? – Raman

+0

@ARBY:sysv ipc api全体のように、単に設計が間違っているだけです。 –

+0

ありがとう! msgget()の戻り値とキーの違いは何ですか?それは私の最初の質問でした。 "衝突"によって、私はあなたが思ったようにいくつかのハッシュテーブルを参照していると思います。 – Raman

関連する問題