システムインタフェース

セマフォの制御

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

GETVAL

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

SETVAL

単一セマフォの値を設定する。この場合には、arg は intarg.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);
 ...