SHMGET(2)

名称
shmget - 共有メモリの識別子の取得

ライブラリ
libc

書式
<machine/param.h> <sys/types.h> <sys/ipc.h> <sys/shm.h> int shmget(key_t key, int size, int flag)

解説
shmget() は、 key と flag の値に従って、新しく作成した共有メモリセグメント または既存の共有メモリセグメントの識別子を戻します。 キーはファイル名に似たもので、IPC オブジェクトを 指定するハンドルを提供するものです。 キーの指定方法には 3 つ方法があります。

•   IPC_PRIVATE を指定すると新しい IPC オブジェクトが作成されます。

•   整定数を指定できます。 key に対応する IPC オブジェクトが指定されておらず、IPC_CREAT ビットが flag で設定されている場合は、新しい IPC オブジェクトが作成されます。

•   ftok() を使用し、パス名からキーを作成できます。 ftok(3) を参照してください。

新しく作成された IPC オブジェクトのモードは、 flag パラメータに渡す以下の定数の論理和で決まります。

SHM_R
    ユーザ用の読取りアクセス

SHM_W
    ユーザ用の書込みアクセス

(SHM_R>>3)
    グループ用の読取りアクセス

(SHM_W>>3)
    グループ用の書込みアクセス

(SHM_R>>6)
    その他用の読取りアクセス

(SHM_W>>6)
    その他用の書込みアクセス

新しい共有メモリセグメントを作成する場合、 size は、新しいセグメントのバイト単位のサイズを表わします。 セグメントのサイズは、カーネルに便利なようにある倍数に 切り上げられることがあります (すなわちページサイズ)。

戻り値
処理が正常に完了すると、 shmget() は共有メモリセグメントの正整数の識別子を返します。 そうでない場合は -1 が返され、エラーを示すために errno が設定されます。

エラー
以下の場合、 shmget() は処理を失敗します。

[EINVAL]
    指定したサイズが、既存セグメントのサイズより大きいです。 指定したサイズが、システムの最低値より小さいか、最大値より大きいです。

[ENOENT]
    key と一致する共有メモリセグメントがなく、IPC_CREAT が指定されていません。

[ENOSPC]
    要求を満たす十分なメモリを、カーネルが割り当てられません。

[EEXIST]
    IPC_CREAT と IPC_EXCL が指定され、 key に対応する共有メモリセグメントがすでに存在します。

関連項目
shmat(2), shmctl(2), shmdt(2), ftok(3)