SHMCTL(2)

名称
shmctl - 共有メモリ制御

ライブラリ
libc

書式
<machine/param.h> <sys/types.h> <sys/ipc.h> <sys/shm.h> int shmctl(int shmid, int cmd, struct shmid_ds *buf)

解説
shmid によって指定された共有メモリセグメント上で cmd によって指定された処理を実行します:

IPC_STAT
    struct shmid_ds のセグメントを取得し、 buf によって指定されたメモリにそれを保存します。

IPC_SET
    struct shmid_ds セグメントの shm_perm.uid, shm_perm.gid, および shm_perm.mode の各メンバを buf で指された構造体のメンバに変更します。 呼び出しプロセスの実効ユーザ ID は、 shm_perm.uid または shm_perm.cuid のどちらかと一致するか、またはスーパユーザ特権を持っている必要があります。

IPC_RMID
    システムからセグメントを除去します。 セグメントにアタッチしたすべてのプロセスが終了するまで、除去は行われません。 しかし、いったん IPC_RMID 操作が実行されると、それ以降プロセスは そのセグメントにアタッチすることを許されません。 操作が成功するためには、呼び出しプロセスの実効ユーザ ID が shm_perm.uid または shm_perm.cuid と一致するか、または呼び出しプロセスにスーパユーザ特権が必要です。

shmid_ds 構造体は次のように定義されます:

    struct shmid_ds {
        struct ipc_perm shm_perm;   /* 操作パーミッション構造体 */
        int             shm_segsz;  /* セグメントのサイズ (バイト単位) */
        pid_t           shm_lpid;   /* 最後の共有メモリ操作のプロセス ID */
        pid_t           shm_cpid;   /* 作成者のプロセス ID  */
        short           shm_nattch; /* 現在のアタッチの数 */
        time_t          shm_atime;  /* 最後の shmat() の時刻 */
        time_t          shm_dtime;  /* 最後の shmdt() の時刻 */
        time_t          shm_ctime;  /* shmctl() による最後の変更の時刻 */
        void           *shm_internal; /* SystemV の愚行 */
    };

戻り値

エラー
shmctl() は次の場合に処理に失敗します:

[EINVAL]
    無効な操作、または shmid に指定された共有メモリセグメントが検出されませんでした。

[EPERM]
    呼び出しプロセスの実効ユーザ ID が、共有メモリセグメントの所有者 または作成者のユーザ ID と一致しません。

[EACCES]
    操作と共有メモリセグメントモードの間の不一致のために パーミッションが拒絶されました。

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