semctl(2) は、セマフォのセットのアクセス権とその他の特性を変更します。semctl(2) は、有効なセマフォ ID を指定して呼び出さなければなりません。semnum 値は、そのインデックスによって配列内のセマフォを選択します。cmd 引数は、次のいずれかの制御フラグです。
GETVAL |
単一セマフォの値を戻す。 |
SETVAL |
単一セマフォの値を設定する。この場合には、arg は int の arg.val と解釈される。 |
GETPID |
セマフォまたは配列に対して最後に操作を実行したプロセスの PID を戻す。 |
GETNCNT |
セマフォの値が増加するのを待っているプロセス数を戻す。 |
GETZCNT |
特定のセマフォの値が 0 に達するのを待っているプロセス数を戻す。 |
GETALL |
セット内のすべてのセマフォの値を戻す。この場合には、arg は unsigned short の配列へのポインタ arg.array と解釈される。 |
SETALL |
セットにあるすべてのセマフォに値を設定する。この場合、arg は unsigned short の配列へのポインタ arg.array と解釈される。 |
IPC_STAT |
制御構造体からセマフォのセットの状態情報を取得し、それを semid_ds 型のバッファへのポインタ arg.buf が指すデータ構造体に入れる。 |
IPC_SET |
有効なユーザおよびグループの識別子とアクセス権を設定する。この場合、arg は arg.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); ... |