SEMGET(2)

名前
semget - セマフォー集合の識別子を取得する

書式
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/sem.h>

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

説明
この関数は key 引き数の値に関連したセマフォー集合(semaphore set)の 識別子(identifier)を返す。 key の値が IPC_PRIVATE の場合には nsems 個のセマフォーからなる新しい集合が作成される。 key が IPC_PRIVATE でなくても key に関連したセマフォー集合が存在せず semflg に IPC_CREAT が指定された( semflg&IPC_CREAT がゼロでない) 場合には nsems 個のセマフォーからなる新しい集合が作成される。 semflg に IPC_CREAT と IPC_EXCL が設定すると、 open(2) システム・コールの mode 引き数に O_CREAT と O_EXCL を指定するのと同じ役割を果し、存在するセマフォー集合を優先する。 例えば semflg に IPC_CREAT と IPC_EXCL の両方が指定された、 key についてセマフォー集合が既に存在していた場合、 semget 関数は失敗する。

作成時に、 semflg 引き数の下位 9 ビットはセマフォー集合のアクセス許可(所有者(owner)、 グループ(group)、他者(other))を定義し、 open(2) や creat(2) システム・コールのアクセス許可パラメーターと同じ意味を持つ。 (しかし、実行(execute)許可はシステムによって使用されていない。 書き込み(write)許可はセマフォー集合の場合は変更(alter)許可として機能する。)

さらに、作成の間、システム・コールはシステム・セマフォー集合の データ構造体 semid_ds を初期化する、構造体は:

    sem_perm.cuid と sem_perm.uid には呼び出したプロセスの実効(effective)ユーザーID が設定される。

    sem_perm.cgid と sem_perm.gid には呼び出したプロセスの実効(effective)グループID が設定される。

    sem_perm.mode の下位 9 ビットには semflg の下位 9 ビットが設定される。

    sem_nsems には nsems の値が設定される。

    sem_otime には 0 が設定される。

    sem_ctime には現在の時刻が設定される。

システム・コールがセマフォー集合を作成しない場合は nsems 引き数は 0 にできる。 その他の場合は nsems は 0 より大きくなければならず、semid ごとのセマフォーの最大数と同じか小さく なければならない (SEMMSL)。

もしセマフォー集合が既に存在するならば、アクセス許可が検査され、 破壊(destruction)マークがないかチェックされる。

返り値
成功した場合、返り値はセマフォー集合の識別子(正の整数)である。 そうでなければ -1 が返され、 errno にそのエラーが示される。

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

EACCES
    key に対応するセマフォー集合は存在するが、 呼び出したプロセスがその集合についてのアクセス許可を持たない。

EEXIST
    key に対応するセマフォー集合が存在し、 semflg に IPC_CREAT と IPC_EXCL が指定された。

EIDRM
    セマフォー集合に削除(delete)マークがある。

ENOENT
    key に対応するセマフォー集合が存在せず、 semflg に IPC_CREAT が指定されていない。

ENOMEM
    セマフォー集合を作成しなければならないが、新しいデータ構造体を 作成するのに十分なメモリがシステムに存在しない。

ENOSPC
    セマフォー集合を作成しなければならないが、システムのセマフォー集合の 最大数 (SEMMNI) またはシステム全体のセマフォーの最大数 (SEMMNS) を超えてしまう。

注意
IPC_PRIVATE はフラグ・フィールドではなく key_t 型である。 この特別な値が key として使用されたならば、システム・コールは semflg の下位 9 ビットを除いて全てを無視して (成功した場合は)新しいセマフォー集合を作成する。

以下は semget コールに影響するセマフォー集合の資源の制限である:

SEMMNI
    システム全体のセマフォー集合の最大数: 方針依存。

SEMMSL
    semid あたりのセマフォーの最大数: 実装依存(現在は 500).

SEMMNS
    システム全体のセマフォーの最大数: 方針依存。 SEMMSL * SEMMNI よりも大きな値は無意味である。

バグ
IPC_PRIVATE の使用しても割当てられたセマフォー集合に対して他のプロセスが アクセスすることを禁止することはできない。

ファイルと同様に、セマフォー集合に対してプロセスの排他的なアクセスを 保証する固有の方法は現在のところ存在しない。 semflg に IPC_CREAT と IPC_EXCL の両方を指定することは(成功した場合に)新しいセマフォー集合が作成される ことのみを保証する。セマフォー集合への排他的アクセスを含んでいない。

集合内の各セマフォーについてデータ構造体はこのシステム・コールでは 初期化されない。それらのデータ構造体を初期化するためには semctl(2) コールを実行して でセマフォー集合に SETVAL か SETALL 命令を行う必要がある。

準拠
SVr4, SVID. SVr4 には他に EINVAL, EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT のエラー状態についての記述がある。

関連項目
ftok(3), ipc(5), semctl(2), semop(2).