sem が指す名前なしセマフォー変数を value の値に初期化するには、sem_init(3RT) を使用します。
int sem_init(sem_t *sem, int pshared, unsigned int value);
#include <semaphore.h> sem_t sem; int pshared; int ret; int value; /* initialize a private semaphore */ pshared = 0; value = 1; ret = sem_init(&sem, pshared, value);
pshared の値が 0 なら、そのセマフォーはプロセス間で共有できません。pshared の値が 0 以外なら、そのセマフォーはプロセス間で共有できます。
複数のスレッドから同じセマフォーを初期化してはいけません。
一度初期化したセマフォーは、ほかのスレッドが使用している可能性があるので、再初期化してはいけません。
pshared が 0 の場合、セマフォーを使用できるのは、このプロセス内のスレッドだけです。
#include <semaphore.h> sem_t sem; int ret; int count = 4; /* to be used within this process only */ ret = sem_init(&sem, 0, count);
pshared が 0 以外の場合、セマフォーは複数のプロセスで共有可能です。
#include <semaphore.h> sem_t sem; int ret; int count = 4; /* to be shared among processes */ ret = sem_init(&sem, 1, count);
sem_init() は、正常終了時に 0 を返します。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、この関数は失敗し、対応する値を返します。
EINVAL
説明:value の値が SEM_VALUE_MAX を超えています。
ENOSPC
説明:そのセマフォーを初期化するのに必要なリソースが使い果たされています。セマフォーの制限 SEM_NSEMS_MAX に達しています。
EPERM
説明:そのセマフォーを初期化するのに必要な特権をそのプロセスがもっていません。