名前


sem_init - 名前なしセマフォを初期化する

書式


#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

説明


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 valueSEM_VALUE_MAX を超えている。
ENOSYS pshared が 0 以外だが、システムがプロセス共有セマフォをサポートしていない (sem_overview(7) 参照)。

準拠


POSIX.1-2001.

注意


妙なことに、POSIX.1-2001 は sem_init() が成功した場合に返すべき値を規定していない。しかしながら、 ほとんどすべての実装がこの場合 0 を返す。

関連項目


sem_destroy(3), sem_post(3), sem_wait(3), sem_overview(7)

openSUSE Logo

コンテンツ