Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all
名前
semget - System V セマフォ集合の識別子を取得する
書式
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg);
説明
semget() システムコールは、引き数 key に対応する System V セマフォ集合 (semaphore set) の 識別子 (identifier) を返す。 key の値が IPC_PRIVATE の場合、もしくは semflg に IPC_CREAT が指定されていて、 key に対応するセマフォ集合が存在しない場合、 nsems 個のセマフォからなる 新しい集合が作成される。 semflg に IPC_CREAT と IPC_EXCL の両方が指定された場合、 key に対応するセマフォ集合が既に 存在すると、 semget() は失敗し、 errno に EEXIST が設定される (これは open(2) に O_CREAT | O_EXCL が指定された場合の動作と同じである)。 セマフォ集合作成時に、引き数 semflg の下位 9 ビットは、そのセマフォ集合の (所有者 (owner)、グループ (group)、 他人 (others) に対する) アクセス許可の定義として使用される。 これらのビットは open(2) の引き数 mode と同じ形式で同じ意味である (但し、実行 (execute) 許可はセマフォでは意味を持たず、 書き込み (write) 許可はセマフォ値の変更 (alter) 許可とし て機能する)。 新規のセマフォ集合を作成する際、 semget() はセマフォ集合の情報を保持するデータ構造体 semid_ds を次のように初期化する (semid_ds については semctl(2) を参照): 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 に (don't care を意味する) 0 を指定しても よい。 そうでない場合は、 nsems は 0 より大きい値でなければならず、セマフォ集合あたりのセ マフォの最大数 (SEMMSL) 以下でなければならない。 セマフォ集合が既に存在した場合は、アクセス許可の検査が行われる。
返り値
成功した場合、セマフォ集合の識別子 (非負の整数) が返り値となる。 失敗した場合は -1 が返さ れ、 errno にエラーを示す値が設定される。
エラー
失敗した場合は errno には以下の値のどれかが設定される: EACCES key に対応するセマフォ集合は存在するが、 呼び出し元のプロセスはその集合へのアクセス 許可がなく、 CAP_IPC_OWNER ケーパビリティも持っていない。 EEXIST semflg に IPC_CREAT と IPC_EXCL が指定されたが、 key に対応するセマフォ集合はすでに 存在する。 EINVAL nsems が 0 より小さいか、 セマフォ集合あたりのセマフォの最大数 (SEMMSL) より大き い。 EINVAL key に対応するセマフォ集合が既に存在するが、 nsems がその集合のセマフォ数よりも大き い。 ENOENT key に対応するセマフォ集合が存在せず、 semflg に IPC_CREAT が指定されてもいない。 ENOMEM セマフォ集合を作成しようとしたが、新しいデータ構造体を 作成するのに十分なメモリーが システムに存在しない。 ENOSPC セマフォ集合を作成しようとすると、システムのセマフォ集合の 最大数 (SEMMNI) か、シ ステム全体のセマフォの最大数 (SEMMNS) のいずれかを超えてしまう。
準拠
SVr4, POSIX.1-2001.
注意
Linux や POSIX の全てのバージョンでは、 <sys/types.h> と <sys/ipc.h> のインクルードは必要 ない。しかしながら、いくつかの古い実装ではこれらのヘッダーファイルのインクルードが必要であ り、 SVID でもこれらのインクルードをするように記載されている。このような古いシステムへの移 植性を意図したアプリケーションではこれらのファイルをインクルードする必要があるかもしれな い。 IPC_PRIVATE はフラグフィールドに指定するものではなく、 key_t 型である。 この特別な値が key に指定されると、 semget() semflg の下位 9 ビット以外は全て無視し、 (成功した場合は) 新し いセマフォ集合を作成する。 セマフォの初期化 新しく作成されたセマフォ集合の各セマフォの値は不定である。 (この点は POSIX.1-2001 と POSIX.1-2008 に明記されている。ただし、POSIX.1-2008 では POSIX の将来のバージョンではセマ フォを 0 に初期化するように実装に要求する可能性が注記されている。) Linux は他の多くの実装 と同様にセマフォ値を 0 に初期化するが、 移植性を考慮したアプリケーションではこの動作を前提 にすべきではない。 アプリケーションは明示的にセマフォを希望の値で初期化すべきである。 semctl(2) の SETVAL か SETALL 操作を使って初期化することができる。 複数箇所からセマフォ集 合の操作が行われる場面では、 誰が最初に集合を初期化すればよいか分からない。 この状況を避け るには、 semctl(2) の IPC_STAT 操作で取得できるセマフォのデータ構造体の sem_otime が 0 以 外になっているかをチェックすればよい。 セマフォの上限 セマフォ集合のリソースに関する上限のうち、 semget() に影響を及ぼすものを以下に挙げる: SEMMNI システム全体のセマフォ集合の上限数: 方針依存 (Linux では、この制限値は /proc/sys/kernel/sem の第4フィールドに対応し、読み出しも変更もできる)。 SEMMSL セマフォ ID あたりのセマフォの最大数: 実装依存 (Linux では、この制限値は /proc/sys/kernel/sem の第1フィールドに対応し、読み出しも変更もできる)。 SEMMNS システム全体のセマフォ数の上限値: 方針依存 (Linux では、この上限値は /proc/sys/kernel/sem の第 2 フィールドであり、読み出しも変更もできる)。 システム全 体のセマフォ数には、 SEMMSL と SEMMNI の積という上限もある。
バグ
IPC_PRIVATE という名前を選んだのはおそらく失敗であろう。 IPC_NEW の方がより明確にその機能 を表しているだろう。
関連項目
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。