Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       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 の場合、もしくは semflgIPC_CREAT
       が指定されていて、 key に対応するセマフォ集合が存在しない場合、 nsems 個のセマフォからなる
       新しい集合が作成される。

       semflgIPC_CREATIPC_EXCL の両方が指定された場合、 key  に対応するセマフォ集合が既に
       存在すると、 semget()  は失敗し、 errnoEEXIST が設定される (これは 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.cuidsem_perm.uid に、呼び出し元のプロセスの実効 (effective) ユーザー
              ID を設定する。

              sem_perm.cgidsem_perm.gid に、呼び出し元のプロセスの実効  (effective)  グループ
              ID を設定する。

              sem_perm.mode の下位 9 ビットに semflg の下位 9 ビットを設定する。

              sem_nsemsnsems の値を設定する。

              sem_otime に 0 を設定する。

              sem_ctime に現在の時刻を設定する。

       セマフォ集合の作成を行わない場合は、引き数 nsems に (don't care を意味する) 0 を指定しても
       よい。 そうでない場合は、 nsems は 0  より大きい値でなければならず、セマフォ集合あたりのセ
       マフォの最大数 (SEMMSL)  以下でなければならない。

       セマフォ集合が既に存在した場合は、アクセス許可の検査が行われる。

返り値

       成功した場合、セマフォ集合の識別子  (非負の整数) が返り値となる。 失敗した場合は -1 が返さ
       れ、 errno にエラーを示す値が設定される。

エラー

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

       EACCES key に対応するセマフォ集合は存在するが、 呼び出し元のプロセスはその集合へのアクセス
              許可がなく、 CAP_IPC_OWNER ケーパビリティも持っていない。

       EEXIST semflgIPC_CREATIPC_EXCL が指定されたが、 key に対応するセマフォ集合はすでに
              存在する。

       EINVAL nsems が 0 より小さいか、  セマフォ集合あたりのセマフォの最大数  (SEMMSL)  より大き
              い。

       EINVAL key に対応するセマフォ集合が既に存在するが、 nsems がその集合のセマフォ数よりも大き
              い。

       ENOENT key に対応するセマフォ集合が存在せず、 semflgIPC_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) の SETVALSETALL 操作を使って初期化することができる。  複数箇所からセマフォ集
       合の操作が行われる場面では、 誰が最初に集合を初期化すればよいか分からない。 この状況を避け
       るには、 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 フィールドであり、読み出しも変更もできる)。  システム全
              体のセマフォ数には、 SEMMSLSEMMNI の積という上限もある。

バグ

       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/ に書かれている。