semget() - セマフォー・セットの取得

標準

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

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

両方  

形式

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

int semget(key_t key, int nsems, int semflg);

機能説明

semget() 関数は、key と関連したセマフォー ID を戻します。

次のいずれかが該当する場合は、セマフォー ID は nsems セマフォーと関連した semid_ds データ構造を用いて作成されます (<sys/sem.h> を参照)。
  • 引数 key は、IPC_PRIVATE の値をとります。
  • 引数 key はセマフォー ID と関連がなく、(semflg および IPC_CREAT) がゼロ以外である。
フィールド semflg の有効値には、<sys/ipc.h> および <sys/modes.h> で定義されている次の定数の組み合わせが入ります。
IPC_CREAT
指定済み key に、まだ関連した ID がない場合には、セマフォーを 作成します。 IPC_PRIVATE が指定されている場合、IPC_CREATE は無視されます。
IPC_EXCL
指定した key に関連した ID がある場合、semget() 関数の障害の原因になります。IPC_EXCL は、IPC_CREAT が指定されていない場合、または IPC_PRIVATE が指定されている場合は無視されます。
__IPC_BINSEM
2 進数セマフォー。セマフォーは、2 進数方式で振る舞う必要があります。つまり、セマフォー操作の数は 1 でなくてはなりません。また、semop が 1 の場合、semval は 0 でなくてはならず、semop が -1 の場合、semval は 0 または 1 でなくてはなりません。このオプションを使用する場合、SEM_UNDO を semop() で使用することができます。このフラグを使用すると、ハードウェアで PLO 命令が使用可能であれば、パフォーマンスが向上します。

セマフォーのパフォーマンスに関する詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。

__IPC_SHORTHOLD
このフラグは、アプリケーションが保持するのは、極めて短い時間シリアライズされているリソースのみであることが知られていることを示します。このフラグを __IPC_BINSEM フラグと結合すると、セマフォー取得リクエスターの デフォルトの先入れ先出し (FIFO) 順序がバイパスされ、短期リクエスターは、次の待機リクエスターへそのセマフォーをディスパッチするのに通常かかる時間内に、セマフォーを正しく取得できる (および、場合によっては解放できる) ようになります。
S_IRUSR
呼び出し元の有効ユーザー ID が、sem_perm.cuid または sem_perm.uid のどちらかと一致する場合、読み取りアクセスを許可します。
S_IWUSR
呼び出し元の有効ユーザー ID が、sem_perm.cuid または sem_perm.uid のどちらかと一致する場合、書き込みアクセスを許可します。
S_IRGRP
呼び出し元の有効グループ ID が、sem_perm.cgid または sem_perm.gid のどちらかと一致する場合、読み取りアクセスを許可します。
S_IWGRP
呼び出し元の有効グループ ID が、sem_perm.cgid または sem_perm.gid のどちらかと一致する場合、書き込みアクセスを許可します。
S_IROTH
その他の読み取りアクセスを許可します。
S_IWOTH
その他の書き込みアクセスを許可します。

引数 key に関連したセマフォー・セットが既に存在している場合、引数 semflgIPC_EXCLIPC_CREAT を設定すると、semget() は失敗します。

semid_ds データ構造の作成時に、次の無名データ構造が、セット中のそれぞれのセマフォーごとに作成されます。
semid_ds データ構造の作成時に、次のフィールドが初期設定されます。
  • フィールド sem_perm.cuid および sem_perm.uid は、呼び出しプロセスの有効ユーザー ID と等しく設定されます。
  • フィールド sem_perm.cgid. および sem_perm.gid は、呼び出しプロセスの有効グループ ID と等しく設定されます。
  • sem_perm.mode の下位 9 ビットは、semflg の下位 9 ビットの値 に設定されます。
  • フィールド sem_nsems は、nsems の値に設定されます。
  • フィールド sem_otime は、0 に設定されます。
  • フィールド sem_ctime は、現在時間に設定されます。
  • それぞれのセマフォーごとに semval を含む無名データ構造は、初期設定されません。semctl() コマンド SETVAL および SETALL を使用して、各セマフォーの semval 値を初期設定する必要があります。

使用上の注意

  1. IPC_BINSEM を使用して作成されたセマフォーは、IPC_BINSEM ビットを示し、w_getipc によって戻される S_MODE バイトに IPC_PLOINUSE ビットを示すことがあります。

戻り値

正常に実行された場合、semget() は、負でないセマフォー ID を戻します。

正常に実行されなかった場合、semget() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
引数 key のセマフォー ID が存在しますが、semflg の 下位 9 ビットで指定されるようなアクセス許可は認可されませんでした。
EEXIST
引数 key にセマフォー ID が存在し、IPC_CREATIPC_EXCL の両方が、semflg で 指定されます。
EINVAL
nsems の値がゼロより小さいか、システム限界より大きいかの どちらかです。key と関連したセマフォー ID が存在せず、nsems がゼロです。key と関連したセマフォー ID が既に存在しており、セマフォー ID の作成時に semget() で指定された nsems 値が、現行の semget() の nsems 値より小さくなっています。フラグを指定した semflg 引数は、現在サポートされていません。
ENOENT
引数 key に関するセマフォー ID が存在していなくて、IPC_CREAT が指定されていません。
ENOSPC
セマフォー ID 数のシステム限界に達しました。
semflg が 0 と等しいときには、以下が適用されます。
  • セマフォー ID を以前に key を使用して作成しており、この semget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がある場合、semget() は関連するセマフォー ID を戻します。
  • セマフォー ID を以前に key を使用して作成しており、この semget() の呼び出しプロセスにその読み取りまたは書き込み許可 (あるいはその両方) がない場合、semget() は -1 を戻して、errno を EACCES に設定します。
  • セマフォー ID がまだ key を使用して作成されていない場合、semget() は -1 を戻して、errno を ENOENT に設定します。

関連情報