SEMCTL(2)

名称
semctl - セマフォ集合に対する操作を制御する

ライブラリ
libc

書式
<sys/types.h> <sys/ipc.h> <sys/sem.h> int semctl(int semid, int semnum, int cmd, ...)

解説
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 によるとこれが必要 */
    };

戻り値
処理が正常に完了すると、 cmd が GETVAL, GETPID, GETNCNT, GETZCNT のどれかであるとき、 semctl() は対応する値を返します。 そうでない場合は 0 を返します。 処理に失敗した場合は、-1 を返し、エラーを示すために errno を設定します。

エラー
semctl() システムコールは次の場合に処理に失敗します:

[EINVAL]
    semid に対応するセマフォ集合がありません。

[EINVAL]
    semnum 引数が、指定のセマフォ集合に対して有効なセマフォの範囲内にありません。

[EPERM]
    呼び出し元プロセスの実効ユーザ ID が、 セマフォ集合の所有者または作成者のユーザ ID と一致しません。

[EACCES]
    操作とセマフォ集合のモードの間に不一致があったために パーミッションが拒否されました。

[ERANGE]
    SETVAL または SETALL が、セマフォを [0 .. SEMVMX] の許容範囲外に設定しようとしました。

関連項目
semget(2), semop(2)

バグ
SETALL は、エラーを返す前にいくつかのセマフォ要素を更新することがあります。