semctl() - セマフォー制御操作

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <sys/sem.h>

int semctl(int semid, int semnum, int cmd, ...);

機能説明

semctl() 関数は、引数 cmd によって指定されているとおりに、セマフォー・セット semid の制御操作を実行します。

引数 cmd の値に従って、引数 semnum は無視されるか、あるいは 1 つの特定セマフォー番号を識別します。

4 番目の引数はオプションで、要求された操作によって異なります。要求された場合には、これは次のような union semun 型で、アプリケーション・プログラムで明示的に宣言する必要があります。
union semun {
     int              val;
     struct semid_ds *buf;
     unsigned short  *array;
} arg;

セマフォー・セットの各セマフォーは、次の無名データ構造によって 表されます。

semctl() を使用して、コマンド GETVAL、SETVAL、GETPID、GETNCNT、および GETZCNT の 1 つの特定セマフォー番号を識別する場合、この無名データ構造に対し、セマフォー semnum についての参照が行われます。

引数 cmd で指定される、以下のような セマフォー制御操作が指定される場合があります。各操作に必要な 許可のレベルは、コマンドと共に示されます。以下のシンボリック定数は、<sys/sem.h> ヘッダーにより定義されます。
GETVAL
現行プロセスに読み取り許可がある場合には、semval の値を 戻します。
SETVAL
semval の値を arg.val に設定します。この場合 arg は、semctl() の 4 番目の引数です。このコマンドが正常に実行されると、すべてのプロセスで指定されているセマフォーに対応する semadj 値がクリアされます。このコマンドには、変更許可が必要です。__IPC_BINSEM セマフォー・セットの場合、設定できる値は 0 と 1 だけです。
GETPID
現行プロセスに読み取り許可がある場合には、最新の プロセスを戻して、セマフォー (sempid) を更新します。
GETNCNT
現行プロセスに読み取り許可がある場合には、セマフォーが 現行値より大きくなるのを待機中のスレッド数が戻されます。
GETZCNT
現行プロセスに読み取り許可がある場合には、セマフォーが ゼロになるのを待機中のスレッド数が戻されます。__IPC_BINSEM セマフォー・セットの場合、この操作により常にゼロが戻されます。つまり、このセマフォー・セットのタイプでセマフォーがゼロになるまでスレッドは待機できません。
GETALL
セマフォー・セット内の各セマフォーごとに semvals を保管し、arg.array で示されている配列に入れます。この場合、arg は semctl() の 4 番目の引数です。GETALL には読み取り許可が必要です。 割り振られたストレージがセマフォー・エレメント数を保持するのに十分な大きさであるこ との保証は、呼び出し元が行います。保管済みセマフォー値数は、sem_nsems で 、IPC_STAT コマンドを使用して取得できます。
SETALL
セマフォー・セット内の各セマフォーごとに、arg.array によって示されている配列に応じて semval を設定します。この場合、arg は、semctl() の 4 番目の引数です。SETALL には変更許可が必要です。それぞれの semval 値は、ゼロまたは正であることが必要です。このコマンドが正常に実行されると、すべてのプロセスで指定された 各セマフォーに対応する semadj 値がクリアされます。 割り振られたストレージがセマフォー・エレメント数を保持するのに十分な大きさであるこ との保証は、呼び出し元が行います。設定されているセマフォー値の数は、sem_nsems です。この値は、IPC_STAT コマンドを使用して取得することができます。 semget で __IPC_BINSEM を指定した場合、他のスレッドがこのセマフォーについてセマフォー操作を実行する可能性がある間は、セマフォー値を更新する際にシリアライズが行われないことがあるので、このオプションは使用しないでください。このため、__IPC_BINSEM セマフォー・セットに対して semop がとられた後は、SETALL を実行することはできません。また、__IPC_BINSEM セマフォー・セットの場合、設定できる値は 0 と 1 だけです。
IPC_STAT
このコマンドは、semid によって指定されたセマフォー ID の 状況情報を取得します。これには、読み取り許可が必要です。この情報は、データ構造 semid_ds によって定義された 4 番目の 引数によって指定されるアドレスに保管されます。
IPC_SET
sem_perm.uidsem_perm.gid、および sem_perm.mode の値を、semid によって指定された セマフォー ID 用の semid_ds データ構造に設定します。これらの値は、4 番目の引数によって指された semid_ds に検出された 値に設定されます。

sem_perm.uid および semperm.gid には どのような値も設定できます。

semget() 関数の引数 semflg のもとで定義 されるモード・ビットだけを sem_perm.mode に 設定することができます。

このコマンドを実行できるのは、該当する特権のあるプロセス、あるいは semid と関連した semid_ds 構造体内の sem_perm.cuid または sem_perm.uid の値のいずれかと等しい有効なユーザー ID を持つプロセスだけです。

IPC_RMID
引数 semid で指定されたセマフォー ID を、システムから除去し、semid_ds 構造体内の セマフォーのセット用のストレージを解放します。

このコマンドを実行できるのは、該当する特権のあるプロセス、あるいは semid と関連した semid_ds 構造体内の sem_perm.cuid または sem_perm.uid の値のいずれかと等しい有効なユーザー ID を持つプロセスだけです。__IPC_BINSEM セマフォー・セットの場合、使用するすべての semop は、セマフォー ID を削除する前に完了させることをお勧めします。

戻り値

正常に実行された場合、semctl() によって戻される値は、以下のように引数 cmd の値により異なります。
GETVAL
semval 値が戻されます
GETPID
sempid 値が戻されます
GETNCNT
semncnt 値が戻されます
GETZCNT
semzcnt 値が戻されます
その他すべて
ゼロ値が戻される
正常に実行されなかった場合、semctl() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
呼び出しプロセスに対する操作許可 (読み取りまたは書き込み) は拒否されます。
EINVAL
引数 semid の値が、無効セマフォー ID であるか、または semnum の値が、ゼロより小さいか、セット中のセマフォー数より大きいか等しいか、または、引数 cmd が、無効コマンドか、あるいは sem_perm.mode に指定されたビットが、未定義です。semnum の有効範囲は、0 ~ セット中のセマフォー数から 1 を引いた値です。
EPERM
引数 cmdIPC_RMID または IPC_SET の 値を持ち、呼び出し元の有効ユーザー ID は、該当する特権のプロセス および semid と関連した semid_ds データ構造 の sem_perm.cuid または sem_perm.uid の値の 有効ユーザー ID ではありません。
ERANGE
引数 cmdSETVAL または SETALL の値をとり、設定される semval 値は <sys/sem.h> で定義されているシステム制限を超えています。

関連情報