Wann sem_unlink()?

Ich bin ein wenig verwirrt durch die Linux-API sem_unlink(), vor allem, Wann oder warum es zu nennen. Ich habe Semaphoren in Windows seit vielen Jahren. In Windows -, sobald Sie in der Nähe der Letzte Griff einer named semaphore entfernt das system das zugrunde liegende kernel-Objekt. Aber es scheint in Linux, die Sie, der Entwickler, muss, entfernen Sie die kernel-Objekt durch Aufruf sem_unlink(). Wenn du nicht die kernel-Objekt bleibt in der /dev/shm Ordner.

Das problem, das ich in, wenn Prozess A ruft sem_unlink (), während Prozess B hat die semaphore gesperrt, es sofort zerstört die semaphore und nun Prozess B nicht mehr "geschützt" durch den semaphor, wenn/falls Prozess C kommt. Was mehr ist, die man-Seite ist bestenfalls verwirrend:

"Die semaphore name wird sofort entfernt. Die semaphore wird zerstört, nachdem alle anderen Prozesse, die das semaphor öffnen, schließen Sie es."

Wie können Sie das Objekt löschen, sofort, wenn es hat zu warten, bis andere Prozesse zu schließen, die semaphore?

Klar kann ich nicht verstehen, die die ordnungsgemäße Verwendung der semaphore-Objekte auf Linux. Vielen Dank für jede Hilfe. Nachfolgend finden Sie einige Beispiel-code, den ich verwende, um dies zu testen.

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;
}
  • Ich glaube du hast das Lesen der manual-Seite sind falsch. "Die semaphore name wird sofort entfernt" bedeutet wörtlich, was er sagt - der name ist entfernt, so dass keine weiteren Prozesse Zugriff auf das semaphore mit diesem Namen. Dies bedeutet nicht, dass der semaphore wird wieder entfernt, nur der name. Der zweite Satz beschreibt, wenn der semaphore wird wieder entfernt - nach jedem Prozess, dass derzeit es zu öffnen und hat es geschlossen
  • Also ich denke, die Frage, an welchem Punkt Sie rufen sem_unlink() zum entfernen eines semaphors? Es scheint der einzige Weg, dies zu gewährleisten, arbeitet korrekt ist, lassen Sie die semaphore auf unbestimmte Zeit auf das system. Dies scheint, wie schlampiger Programmierung, aber ich sehe keine andere Lösung.
  • Ich denke, die Idee ist, dass Sie es entfernen, an welchem Punkt Sie sich entscheiden, Sie nicht mehr wollen neue Prozesse in der Lage sein zu befestigen, um es. Das system ermöglicht, Prozesse, die sind bereits angebracht, um den Betrieb fortzusetzen, nur Müll sammeln die Ressourcen, wenn die Letzte gerade aktive Benutzer geht Weg. Ich werde nicht beurteilen, ob dies "schlampig" ist oder nicht, aber Bedenken Sie, dies ist eine ziemlich alte Schnittstelle/API, so kann es nicht sein, "ideal", nach heutigen standards, aber es funktioniert immer noch, für was es für entworfen wurde, und damit weiterhin nützlich sein.
  • name wird entfernt, so dass keine weiteren Prozesse Zugriff auf das semaphore mit diesem Namen. [...] die semaphore entfernt, nach der jeder Prozess, der derzeit es zu öffnen und hat es geschlossen." Aber wenn "keine weiteren Prozesse kann auf die semaphore", dann können Sie nicht schließen Sie es. Ihre Phrasierung (und in der Manpage) ist verwirrend, etwas, das geschieht alle zu Häufig.
  • Zu klären - keine weiteren Prozesse Prozesse, die nicht bereits ein offenes handle auf das semaphor. Diejenigen, die haben ein offenes Griff noch in der Lage sein, um es zu schließen, natürlich, sonst wird die Referenz-Zählung könnte nie auf 0 sinkt, so dass die Ressourcen freigesetzt werden könnten...
  • Ich denke, Sie haben meinen Punkt: die Sprache ist unklar. Ein besserer Satz wäre gewesen "der name ist so entfernt, dass keine Prozesse den Zugriff auf das semaphore; Prozesse, die bereits Zugriff auch weiterhin tun."

InformationsquelleAutor user2124642 | 2013-03-01
Schreibe einen Kommentar