1
我有一個項目,我必須使用SYS V信號量。我有共用一個信號量(使用相同的密鑰),並使用此代碼初始化幾個過程:正確刪除幾個進程使用的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來做的正確方法。
問題是圖書館是分散的。正如你所說,我將不得不使用另一個信號來進行引用計數。但誰會釋放它? –