Ich bin etwas verwirrt von der Linux-API sem_unlink(), vor allem, wenn oder warum ich es nennen soll. Ich habe Semaphore in Windows seit vielen Jahren verwendet. Wenn Sie in Windows das letzte Handle eines benannten Semaphors schließen, entfernt das System das zugrunde liegende Kernel-Objekt. Aber unter Linux scheint der Entwickler das Kernel-Objekt durch Aufruf von sem_unlink() entfernen zu müssen. Wenn das Kernel-Objekt nicht vorhanden ist, bleibt es im Ordner/dev/shm erhalten.Wann sem_unlink() aufrufen?
Das Problem, auf das ich stoße, wenn Prozess A sem_unlink() aufruft, während Prozess B den Semaphor gesperrt hat, zerstört es sofort den Semaphor und jetzt ist Prozess B nicht mehr durch den Semaphor "geschützt" wenn/falls Prozess C kommt vorbei. Außerdem ist die Manpage bestenfalls verwirrend:
"Der Semaphorname wird sofort entfernt. Der Semaphor wird zerstört, sobald alle anderen Prozesse, die den Semaphor geöffnet haben, ihn schließen."
Wie kann es das Objekt sofort zerstören, wenn es auf andere Prozesse warten muss, um den Semaphor zu schließen?
Klar verstehe ich nicht die ordnungsgemäße Verwendung von Semaphor-Objekten unter Linux. Danke für jede Hilfe. Im Folgenden finden Sie einen Beispielcode, den ich zum Testen verwende.
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 denke, Sie lesen die Handbuchseite falsch. "Der Name des Semaphors wird sofort entfernt" bedeutet wörtlich, was er sagt - der Name wird entfernt, so dass keine weiteren Prozesse auf den Semaphor mit diesem Namen zugreifen können. Dies bedeutet nicht, dass der Semaphor entfernt wird, nur der Name.Der zweite Satz beschreibt, wenn der Semaphor entfernt wird - nachdem jeder Prozess, der ihn gerade geöffnet hat, ihn geschlossen hat – twalberg
Also ich denke, die Frage wird, an welchem Punkt nennst du sem_unlink(), um einen Semaphor zu entfernen? Es scheint der einzige Weg, um sicherzustellen, dass dies korrekt funktioniert, ist, den Semaphor auf unbestimmte Zeit auf dem System zu belassen. Das klingt nach schlampiger Programmierung, aber ich sehe keine andere Lösung. – user2124642
Ich denke, die Idee ist, dass Sie es an jedem Punkt entfernen Sie entscheiden, dass Sie nicht mehr wollen, dass neue Prozesse an es anhängen können. Das System lässt Prozesse, die bereits angehängt sind, weiterarbeiten, nur Müll sammelt die Ressourcen, wenn der letzte gerade aktive Benutzer weggeht. Ich werde nicht beurteilen, ob das "schlampig" ist oder nicht, aber denken Sie daran, dies ist eine ziemlich alte Schnittstelle/API, also ist es vielleicht nicht "ideal" nach heutigen Standards, aber es funktioniert immer noch für das, was es war entwickelt für und ist somit weiterhin nützlich. – twalberg