標準
標準/拡張機能 |
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 に関連したセマフォー・セットが既に存在している場合、引数 semflg に IPC_EXCL と IPC_CREAT を設定すると、semget() は失敗します。
semid_ds データ構造の作成時に、次の無名データ構造が、セット中のそれぞれのセマフォーごとに作成されます。
unsigned short int |
semval |
セマフォー値 |
pid_t |
sempid |
最終操作のプロセス ID |
unsigned sort int |
semcnt |
semval が現行値より大きくなるのを待っているプロセスの数 |
unsigned short int |
semzcnt |
semval がゼロになるのを待っているプロセスの数 |
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 値を初期設定する必要があります。
使用上の注意
- IPC_BINSEM を使用して作成されたセマフォーは、IPC_BINSEM ビットを示し、w_getipc によって戻される S_MODE バイトに IPC_PLOINUSE ビットを示すことがあります。
戻り値
正常に実行された場合、semget() は、負でないセマフォー ID を戻します。
正常に実行されなかった場合、semget() は -1 を戻して、errno を次のいずれかの
値に設定します。
- エラー・コード
- 説明
- EACCES
- 引数 key のセマフォー ID が存在しますが、semflg の
下位 9 ビットで指定されるようなアクセス許可は認可されませんでした。
- EEXIST
- 引数 key にセマフォー ID が存在し、IPC_CREAT と IPC_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 に設定します。