Linux API sem_unlink() に少し混乱しています。主に、いつ、またはなぜそれを呼び出すかです。私は長年 Windows でセマフォを使用してきました。Windows では、名前付きセマフォの最後のハンドルを閉じると、システムは基になるカーネル オブジェクトを削除します。しかし Linux では、開発者が sem_unlink() を呼び出してカーネル オブジェクトを削除する必要があるようです。そうしないと、カーネル オブジェクトは /dev/shm フォルダーに保持されます。
私が直面している問題は、プロセス B がセマフォをロックしているときにプロセス A が sem_unlink() を呼び出すと、すぐにセマフォが破棄され、プロセス C が発生した場合にプロセス B がセマフォによって「保護」されなくなります。さらに、マニュアルページはせいぜい混乱しています。
「セマフォ名はすぐに削除されます。セマフォを開いている他のすべてのプロセスがセマフォを閉じると、セマフォは破棄されます。」
他のプロセスがセマフォを閉じるのを待たなければならない場合、オブジェクトをすぐに破棄するにはどうすればよいでしょうか?
明らかに、Linux でのセマフォ オブジェクトの適切な使用方法がわかりません。助けてくれてありがとう。以下は、これをテストするために使用しているサンプルコードです。
int main(void)
{
sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1);
if(pSemaphore != SEM_FAILED)
{
if(sem_wait(pSemaphore) == 0)
{
// Perform "protected" operations here
sem_post(pSemaphore);
}
sem_close(pSemaphore);
sem_unlink("/MyName");
}
return 0;
}