################################################################################ ●メッセージキュー作成方法について ################################################################################ 1.msgget @メッセージキューの作成およびメッセージキューIDの取得はmsggetシステムコールを 使います。 [形式] int msgget(key_t key, int msgflg); [機能] key_t key: メッセージキューのIPCキーを指定します。 int msgflg: アクセスモードを指定します。(ファイルと同じ考えをします。) これにIPC_CREATが指定された場合、keyに対応するメッセージ キューが存在しないと 作成します。存在する場合はメッセージ キューIDを返します。 [戻り値]メッセージキューのキューIDを返却します。失敗した場合は-1を返却します。 A実装時の方法 a)キーにIPC_PRIVATEを指定する。 keyにIPC_PRIVATEを指定してメッセージキューを作成します。 例) msgget(IPC_PRIVATE, IPC_CREAT | 0666); [解説] システム内でユニークなメッセージキューIDを保証します。 キューは必ず作成されます。 この方法は各プロセス間で、ユニークなメッセージキューの作成が保証されます。 反面、キュー作成後にキューIDの取得ができないため複数プロセス(複数クラス) で キューを共有する場合はパラメータによるキューIDの受け渡し等が必要になります。 b)任意のキーを指定する。 keyに任意のキーを指定してメッセージキューを作成します。 例) msgget((key_t)100, IPC_CREAT | 0666); [解説] キーが100であるメッセージキューが存在しない場合は作成します。 すでに存在する場合は、そのメッセージキューのキューIDを返します。 この方法はキーで指定したメッセージキューが、他プロセスにより作成されている 場合、意図しないキューにアクセスしてしてしまいますので非常に危険です。 c)キーを取得して、それを指定する。 キーをftok関数で取得し、それを指定する。 [形式] key_t ftok(char *path, int id); [機能] char *path : 任意のパス名(存在するファイル名)を指定します。 int id: 任意の整数を指定します。 [戻り値]ユニークなキーを返却します。失敗した場合は-1を返却します。 例) key_t key; key = ftok("/tmp/msgqfile", 1); msgget(key, IPC_CREAT | 0666); [解説] /tmp/msgqfileファイルのid=1に対応づけらてたキーのメッセージキュー が存在しない 場合は作成します。 すでに存在する場合は、そのメッセージキューのキューIDを返します。 この方法は各プロセス間で、ユニークなメッセージキューの作成が保証 されます。 複数プロセス(複数クラス)でキューを共有する場合、ftok関数で指定する pathとidの 合意があればパラメータによるキューIDの受け渡し等が不要に なります。pathで表され るファイルは、プロセス存在中は削除してはいけ ません。