SYS V セマフォを使用しなければならないプロジェクトがあります。セマフォを(同じキーを使用して)共有し、次のコードで初期化するプロセスがいくつかあります。
bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key)
{
/* Try to get a semaphore, to check if you will be an owner */
*sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
if (*sem == -1)
{
if (errno == EEXIST)
{
/* We are not owners, get semaphore without exclusive flag */
*sem = semget(key, 1, IPC_CREAT | 0666);
if (*sem == -1) return false;
}
else return false;
}
else
{
/* We are owners, initialize semaphore */
int return_value = semctl(*sem , 0, SETVAL, sem_value);
if (return_value == -1) return false;
}
return true;
}
私の問題は、このセマフォを使用しているすべてのプロセスが終了するときに、このセマフォを削除したいということです。使用:
semctl(*sem, 0, IPC_RMID)
オプションではありません。セマフォを即座に削除し、他のプロセスは未定義の動作をしました。SYS V API でそれを行う正しい方法が見つかりません。