semctl()
システムコールは、
cmd
が示す操作を
semid
で示されるセマフォ集合に対して実行します。
ある値の
cmd
に対しては、4 番目の引数
union semun arg
が必要です。
arg
引数を使用するコマンドの場合、
union semun
は次のように定義されます:
union semun {
        int     val;            /*  SETVAL 用の値 */
        struct  semid_ds *buf;  /*  IPC_STAT および IPC_SET 用のバッファ */
        u_short *array;         /*  GETALL および SETALL 用の配列 */
};
コマンドは次のように実行されます:
|
| IPC_STAT | セマフォ集合の
struct semid_ds
を取得し、
arg.buf
が指すメモリに保存します。 | 
| IPC_SET | セマフォ集合の
struct semid_ds
のメンバ
sem_perm.uid,
sem_perm.gid
および
sem_perm.mode
を、
arg.buf
が指す構造体のメンバと一致するように変更します。
呼び出し元プロセスの実効ユーザ ID は、
sem_perm.uid
または
sem_perm.cuid
のどちらかと一致する必要があるか、
またはスーパユーザ特権を持っている必要があります。 | 
| IPC_RMID | セマフォ集合をただちにシステムから削除します。
呼び出し元プロセスの実効ユーザ ID がセマフォ集合の
sem_perm.uid
または
sem_perm.cuid
と等しいか、またはプロセスがスーパユーザ特権を持っている必要があります。 | 
| GETVAL | セマフォ番号
semnum
の値を返します。 | 
| SETVAL | セマフォ番号
semnum
の値を
arg.val
に設定します。
あらゆるプロセス中の、このセマフォに対する未適用の終了時調整値は、
消されます。 | 
| GETPID | セマフォ番号
semnum
について操作を実行した最後のプロセスのプロセス ID を返します。 | 
| GETNCNT | セマフォ番号
semnum
の値が現在の値より大きくなるのを待っているプロセスの数を返します。 | 
| GETZCNT | セマフォ番号
semnum
の値が 0 になるのを待っているプロセスの数を返します。 | 
| GETALL | 集合内のすべてのセマフォの値を
arg.array
が指す配列内へ取得します。 | 
| SETALL | 集合内のすべてのセマフォの値を
arg.array
が指す配列内の値に設定します。
あらゆるプロセス中の、この集合に属するすべてのセマフォに対する未適用の
終了時調整値は、消されます。 | 
|
struct semid_ds
は次のように定義されます:
struct semid_ds {
        struct  ipc_perm sem_perm;      /* 操作パーミッション構造体 */
        struct  sem *sem_base;  /* 集合内の最初のセマフォへのポインタ */
        u_short sem_nsems;      /* 集合内のセマフォの数 */
        time_t  sem_otime;      /* 最後の操作時刻 */
        long    sem_pad1;       /* SVABI/386 によるとこれが必要 */
        time_t  sem_ctime;      /* 最後の変更時刻
                                 * 1970/01/01 00:00:00 GMT
                                 * からの秒単位の経過時間
                                 */
        long    sem_pad2;       /* SVABI/386 によるとこれが必要 */
        long    sem_pad3[4];    /* SVABI/386 によるとこれが必要 */
};