15

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;
}
4

2 に答える 2

13

ご質問への回答:

  1. あなたが説明するウィンドウのセマフォの動作と比較して、POSIX セマフォはカーネル永続的です。セマフォが開いているプロセスがない場合でも、セマフォはその値を保持することを意味します。(セマフォの参照カウントは 0 になります)

  2. プロセス B がセマフォをロックしているときに、プロセス A が sem_unlink() を呼び出した場合。これは、セマフォの参照カウントが 0 ではなく、破棄されないことを意味します。

sem_close と sem_unlink の基本的な操作は、全体的な理解に役立つと思います。

sem_close: close はセマフォです。これは、プロセスが終了するときにも行われます。セマフォはまだシステムに残っています。

sem_unlink:参照カウントが 0 に達した場合 (つまり、それを開いているすべてのプロセス、sem_close を呼び出すか、終了した後) にのみシステムから削除されます。

参考文献: 本 - Unix Networking Programming-Interprocess Communication by W.Richard Stevens、vol 2、ch10

于 2014-02-22T23:16:40.920 に答える