sem_open -
名前付きセマフォを初期化し、オープンする
#include <fcntl.h> /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value);
-pthread とリンクする。
sem_open() は、新規の POSIX
セマフォを作成するか、既存のセマフォのオープンを行う。
セマフォは
name
で識別される。
name
の構成の詳細は
sem_overview(7) を参照。
oflag 引数には、
sem_open()
の動作を制御するフラグを指定する
(oflag の値の定義は
<fcntl.h>
のインクルードにより得られる)。
oflag に
O_CREAT
が指定されると、まだ存在しない場合にはそのセマフォが作成される。
セマフォの所有者
(ユーザー
ID)、グループ所有権
(グループ ID) には、
それぞれ呼び出し元プロセスの実効
UID、実効 GID
が設定される。
oflag に
O_CREAT と
O_EXCL
の両方が指定された場合、指定された名前
name
のセマフォがすでに存在するとエラーが返される。
oflag に
O_CREAT
を指定する場合、さらに引数が
2 つ必要である。
mode
引数は、
open(2)
と同じように、新しいセマフォに設定されるアクセス許可
(permission) を
指定する。許可設定はプロセスの
umask でマスクされる
(許可ビットのシンボル定義は
<sys/stat.h>
のインクルードにより得られる)。
セマフォにアクセスしようとするユーザーは、読み出し許可と書き込み許可の
両方を得る必要がある。
value
引数は新しいセマフォの初期値を指定する。
O_CREAT
が指定され、指定した名前
name
のセマフォがすでに存在する場合、
mode と
value
は無視される。
成功すると、
sem_open()
は新しいセマフォのアドレスを返す。
このアドレスは他のセマフォ関連の関数を呼び出す際に使用される。
エラーの場合、
sem_open()
は
SEM_FAILED を返し、
errno
にエラーを示す値をセットする。
- EACCES
- そのセマフォが存在するが、呼び出し元にはそのセマフォをオープンする
許可がない。
- EEXIST
-
oflag に O_CREAT と O_EXCL
の両方が指定されたが、
name
という名前のセマフォはすでに存在する。
- EINVAL
-
value が SEM_VALUE_MAX
よりも大きい。
- EINVAL
-
name が "/"
だけで構成され、その後ろに他の文字が続いていなかった。
- EMFILE
- オープンされたファイルディスクリプターの総数がプロセス単位の上限に達している。
- ENAMETOOLONG
-
name
が長すぎる。
- ENFILE
- オープンされたファイル総数がシステム全体での上限に達している。
- ENOENT
-
oflag に O_CREAT
フラグが指定されておらず、
name
という名前のセマフォも存在しない。
または、 O_CREAT
が指定されたが、
name
が適切な形式ではなかった。
- ENOMEM
- 十分なメモリーがない。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
sem_open() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
sem_close(3),
sem_getvalue(3),
sem_post(3),
sem_unlink(3),
sem_wait(3),
sem_overview(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。