MSGGET(2) | Linux Programmer's Manual | MSGGET(2) |
msgget - System V メッセージキュー識別子を取得する
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflg);
msgget() システムコールは key 引き数の値に対応する System V メッセージキューの識別子を返す。 key の値が IPC_PRIVATE の場合、または key が IPC_PRIVATE でなくても、 key に対応するメッセージキューが存在せず、 msgflg に IPC_CREAT が指定されている場合、 新しいメッセージキューが作成される。
msgflg に IPC_CREAT と IPC_EXCL の両方が指定された場合、 key に対応するメッセージキューが既に存在すると、 msgget() は失敗し、 errno に EEXIST が設定される。 (これは open(2) に O_CREAT | O_EXCL を指定した場合の動作と同じである)
メッセージキューの作成時に、 msgflg 引き数の下位 9 ビットは、 そのメッセージキューのアクセス許可の定義として使用される。 これらの許可ビットは open(2) の引き数 mode と同じ形式で同じ意味である。 や creat(2) システムコールのアクセス許可パラメーターと同じ形式で、同じ意味を持つ。 (但し、実行 (execute) 許可は使用されない。)
新規のメッセージキューを作成する際、 msgget() システムコールはメッセージキューのデータ構造体 msqid_ds を以下のように初期化する (msqid_ds については msgctl(2) を参照):
メッセージキューがすでに存在する場合は、アクセス許可の検査と、 破棄 (destruction) マークがないかの確認が行われる。
成功した場合、返り値はメッセージキュー識別子 (非負の整数) となる。 失敗した場合は -1 が返され、 errno にそのエラーが示される。
失敗した場合、 errno に以下の値のいずれか一つが設定される:
SVr4, POSIX.1-2001.
Linux や POSIX の全てのバージョンでは、 <sys/types.h> と <sys/ipc.h> のインクルードは必要ない。しかしながら、いくつかの古い実装ではこれらのヘッダーファイルのインクルードが必要であり、 SVID でもこれらのインクルードをするように記載されている。このような古いシステムへの移植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれない。
IPC_PRIVATE はフラグではなく、 key_t 型である。 この特別な値が key として使用された場合、 msgget() システムコールは msgflg の下位 9 ビット以外の全てを無視して (成功した場合は) 新しいメッセージキューを作成する。
msgget() システムコールに影響を及ぼすメッセージキューの資源の システムとしての制限を以下に示す:
Linux 2.3.20 までは、削除が予定されているメッセージキューに対して msgget() を行うと EIDRM がエラーとして返されるようになっていた。
IPC_PRIVATE という名前を選んだのはおそらく失敗であろう。 IPC_NEW の方がより明確にその機能を表しているだろう。
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), svipc(7)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-04-30 | Linux |