SEMCTL(2)

名前
semctl - セマフォーの制御操作を行なう

書式
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* 共用体 semun の定義は <sys/sem.h> に含まれている */
#else
/* X/OPEN に従うならば自分自身で以下のように定義しなければならない */
union semun {
	int val;                    /* value for SETVAL */
	struct semid_ds *buf;       /* buffer for IPC_STAT, IPC_SET */
	unsigned short int *array;  /* array for GETALL, SETALL */
	struct seminfo *__buf;      /* buffer for IPC_INFO */
};
#endif

int semctl (int semid, int semnum, int cmd, union semun arg)

説明
この関数は semid で指定されたセマフォー集合(semaphore set)(または セマフォー集合の semnun番目 のセマフォー)に cmd 指定された制御操作を行なう。集合の最初のセマフォーは semnun の値 0 で示される。

cmd の値は

IPC_STAT
    セマフォー集合のデータ構造体の情報を arg.buf. で指されたバッファーへコピーする。 semnum 引き数は無視される。呼び出したプロセスはそのセマフォー集合に対する 読み込みアクセスの権限を持たなければならない。

IPC_SET
    arg.buf で指定された semid_ds 構造体のメンバーのいくつかの値をセマフォー集合のデータ構造体に書き込む、 sem_ctime メンバーの値も更新される。 arg.buf によって指定されるユーザーの与えた semid_ds 構造体 のうち考慮されるメンバーは以下の通り

    	sem_perm.uid
    	sem_perm.gid
    	sem_perm.mode	/* only lowest 9-bits */

    呼び出したプロセスの実効(effective)ユーザーID はスーパー・ユーザーか、 そのセマフォー集合の作成者(creator)か所有者(owner)でなければならない。 semnum 引き数は無視される。

IPC_RMID
    セマフォー集合とそのデータ構造体をただちに削除(remove)し、 待ち状態にあるプロセスを目覚めさせる(それは errno に EIDRM が設定され、エラーとして返されることによる。) 呼び出したプロセスの実効(effective)ユーザーID はスーパーユーザーか、 そのセマフォー集合の作成者(creator)か所有者(owner)でなければならない。 semnum 引き数は無視される。

GETALL
    集合の全てのセマフォーの semval の値を arg.arrayR に返す。 semnum 引き数は無視される。 呼び出したプロセスはそのセマフォー集合に読み込みアクセスの権利を持たなければ ならない。

GETNCNT
    システム・コールは集合の semnum番目 のセマフォーの semncnt の値を返す(集合の semnum番目 のセマフォーの semval の増加を待っているプロセスの数)。 呼び出したプロセスはそのセマフォー集合に読み込みアクセスの権利を持たなければ ならない。

GETPID
    システム・コールは集合の semnum番目 のセマフォーの sempid の値を返す。(集合の semnum番目 のセマフォーに最後に semop コールを実行したプロセスの pid)。 呼び出したプロセスはそのセマフォー集合に読み込みアクセスの権利を持たなければ ならない。

GETVAL
    システム・コールは集合の semnum番目 のセマフォーの semval の値を返す。 呼び出したプロセスはそのセマフォー集合に読み込みアクセスの権利を持たなければ ならない。

GETZCNT
    システム・コールは集合の semnum番目 のセマフォーの semzcnt の値を返す(集合の semnum番目 のセマフォーの semval の値が 0 になるのを待っているプロセスの数)。 呼び出したプロセスはそのセマフォー集合に読み込みアクセスの権利を持たなければ ならない。

SETALL
    集合の全てのセマフォーの semval に arg.array で指定された値を設定する。 その集合の semid_ds 構造体の sem_ctime メンバーの値も更新する。 全てのプロセスのセマフォーの変更についてのアンドゥ・エントリは 消去(clear)される。 semval の値が 0 になるか増加した場合は待ちキュー(queue)で停止(sleep)していた プロセスは再開(awake)される。 semnum 引き数は無視される。 呼び出したプロセスはそのセマフォー集合に変更アクセスの権利を持たなければ ならない。

SETVAL
    集合の semnum番目の セマフォーの semval に arg.val の値を設定する。その集合に関連する semid_ds 構造体の sem_ctime メンバーの値も更新する。 全てのプロセスのセマフォーの変更についてのアンドゥ・エントリは消去される。 semval の値が 0 になるか増加した場合は待ちキュー(queue)で停止(sleep)していた プロセスは再開(awake)される。 呼び出したプロセスはそのセマフォー集合に変更アクセスの権利を持たなければ ならない。

返り値
失敗した場合はシステム・コールは -1 を返し、 errno にそのエラーを示す。 そうでなければシステム・コールは cmd によって以下の負でない値を返す:

GETNCNT
    semncnt の値。

GETPID
    sempid の値。

GETVAL
    semval の値、

GETZCNT
    semzcnt の値。

エラー
失敗した場合は errno には以下の値のどれかが設定される:

EACCES
    呼び出したプロセスが cmd を実行するのに必要なアクセス許可を持っていない。

EFAULT
    arg.buf または arg.array で指されているアドレスにアクセスすることができない。

EIDRM
    セマフォー集合が削除(remove)された。

EINVAL
    cmd または semid に無効な値が指定された。

EPERM
    cmd 引き数に IPC_SET または IPC_RMID が指定され、呼び出したプロセスの実効(effective)ユーザーID が そのコマンドを実行する権利を持っていない。

ERANGE
    cmd 引き数に SETALL または SETVAL が指定され、(集合のセマフォーのどれかの) semval に設定される値が 0 より小さいか、実装値 SEMVMX よりも大きい、

注意
IPC_INFO と SEM_STAT と SEM_INFO 制御コールは ipcs(8) プログラムによって割当られた資源について情報を提供するために使用される。 将来的にはこれらは proc ファイル・システムを使用したものに修正される かもしれない。

以下は semctl コールに影響するセマフォー集合のシステム制限:

SEMVMX
    semval の最大値 : 実装依存(32767)。

準拠
SVr4, SVID. SVr4 には他に EINVAL, EOVERFLOW エラーについての記述がある。

関連項目
ipc(5), shmget(2), shmat(2), shmdt(2).