sem_init -
名前なしセマフォを初期化する
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
-pthread とリンクする。
sem_init() は、
sem
が指すアドレスにある名前なしセマフォを初期化する。
value
引数はそのセマフォの初期値を指定する。
pshared
引数は、このセマフォがプロセス内のスレッド間で共有されるのか、
プロセス間で共有されるのか、を示す。
pshared が 0
の場合、セマフォはプロセス内のスレッド間で共有される。
セマフォはすべてのスレッドから参照可能なアドレスに配置すべきである
(例えば、大域変数や、ヒープ上に動的に割り当てられた変数など)。
pshared が 0
以外の場合、セマフォはプロセス間で共有される。セマフォは
共有メモリー領域に配置すべきである
(
shm_open(3),
mmap(2),
shmget(2)
参照)。 (
fork(2)
で生成された子プロセスは親プロセスのメモリーマッピングを継承するため、
子プロセスもセマフォにアクセスできる。)
共有メモリー領域にアクセスできるプロセスならば、どのプロセスでも
sem_post(3) や
sem_wait(3)
などを使ってセマフォを操作できる。
すでに初期化済のセマフォを初期化した場合の挙動は定義されていない。
成功すると、
sem_init() は 0
を返す。エラーの場合、-1
を返し、
errno
にエラーを示す値をセットする。
- EINVAL
-
value が SEM_VALUE_MAX
を超えている。
- ENOSYS
-
pshared が 0
以外だが、システムがプロセス共有セマフォをサポートしていない
( sem_overview(7) 参照)。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
sem_init() |
Thread safety |
MT-Safe |
POSIX.1-2001.
妙なことに、POSIX.1-2001 は
sem_init()
が成功した場合に返すべき値を規定していない。
POSIX.1-2008
ではこれが修正され、成功時には
0
を返すことが規定された。
sem_open(3) と
sem_wait(3) を参照。
sem_destroy(3),
sem_post(3),
sem_wait(3),
sem_overview(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。