プログラミングインタフェース

セマフォーの制御

semctl(2) は、セマフォーのセットのアクセス権とその他の特性を変更します。semctl(2) では、有効なセマフォー ID を指定して呼び出してください。semnum 値は、そのインデックスによって配列内のセマフォーを選択します。cmd 引数は、次のいずれかの制御フラグです。

GETVAL

単一セマフォーの値を戻します。

SETVAL

単一セマフォーの値を設定します。この場合、argint 値の arg.val と解釈されます。

GETPID

セマフォーまたは配列に対して最後に操作を実行したプロセスの PID を戻します。

GETNCNT

セマフォーの値が増加するのを待っているプロセス数を戻します。

GETZCNT

特定のセマフォーの値が 0 に達するのを待っているプロセス数を戻します。

GETALL

セット内のすべてのセマフォーの値を戻します。この場合、argunsigned short 値の配列へのポインタである arg.array と解釈されます。

SETALL

セット内のすべてのセマフォーに値を設定します。この場合、argunsigned short 値の配列へのポインタである arg.array と解釈されます。

IPC_STAT

制御構造体からセマフォーのセットの状態情報を取得し、semid_ds 型のバッファーへのポインタ arg.buf が指すデータ構造体に入れます。

IPC_SET

有効なユーザーおよびグループの識別子とアクセス権を設定します。この場合、argarg.buf と解釈されます。

IPC_RMID

指定したセマフォーのセットを削除します。

IPC_SET または IPC_RMID コマンドを実行するには、所有者、作成者、またはスーパーユーザーとして有効なユーザー識別子を持つ必要があります。その他の制御コマンドには、読み取り権と書き込み権が必要です。

次のコードに、semctl(2) の使用例を示します。

#include                     <sys/types.h>
#include                     <sys/ipc.h>
#include                     <sys/sem.h>
...
        register int         i;
...
        i = semctl(semid, semnum, cmd, arg);
        if (i == –1) {
               perror("semctl: semctl failed");
               exit(1);
...