Ich bin mit flock() für Inter-Prozess namens mutexes (dh einige Verfahren eine Sperre auf „some_name“ entscheiden können, halten, die durch Sperren eine Datei in einem temporären Verzeichnis mit dem Namen implementiert wird „some_name“:flock(): Entfernen der gesperrten Datei ohne Racebedingung?
lockfile = "/tmp/some_name.lock";
fd = open(lockfile, O_CREAT);
flock(fd, LOCK_EX);
do_something();
unlink(lockfile);
flock(fd, LOCK_UN);
die Sperrdatei irgendwann entfernt werden soll, um zu vermeiden, Hunderte von Dateien des temporäre Verzeichnis füllt
Allerdings gibt es eine offensichtliche race-Bedingung in diesem Code, beispielsweise mit Verfahren A, B und C:.
A opens file
A locks file
B opens file
A unlinks file
A unlocks file
B locks file (B holds a lock on the deleted file)
C opens file (a new file one is created)
C locks file (two processes hold the same named mutex !)
Ist t hier eine Möglichkeit, die Sperrdatei irgendwann zu entfernen, ohne diese Race Condition einzuführen?
Problem ist, dass Sie versuchen, eine feinkörnige Sperrstrategie zu implementieren (Dateien stellen Ressourcen dar), aber Sie haben Konflikte auf einer freigegebenen grobkörnigen Ressource (dem Dateisystem). Sie benötigen entweder eine globale Sperre für das Sperrdateiverzeichnis, bevor Sie Ihre feinkörnigen Sperren aktualisieren, oder Sie ändern Ihre Sperrstrategie vollständig neu. – jxh
Können Sie Ihr Bedürfnis ausarbeiten? ZB warum benutzen die Programme nicht einen bekannten Dateinamen, wenn sie alle dieselbe konzeptionelle Ressource sperren? –