BLUESCREEN3D
29-04-2006, 18:33
Ich wollte ein Programm schreiben, dass nicht mit mehren Instanzen parallel in dem selben Verzeichnis laufen soll.
Dazu wollte ich beim Programmstart ein Advisory Lockfile in der dem Verzeichnis anlegen, das verhindert, dass weitere Instanzen des Programmes gleichzeitig laufen (diese sollen nicht auf den laufenden Prozess warten, sondern sich gleich wieder beenden, falls ein anderer Prozess läuft).
Mein erster Ansatz war, das ganze über open() mit O_EXCL zu realisieren. Das funktioniert soweit wie gewollt, hat aber einen Nachteil: Falls das Programm crasht bleibt das Lockfile bestehen und verhindert weitere Programmdurchläufe bis die Datei manuell entfernt wird.
Falls man stattdessen mit fcntl() arbeitet sind die Operationen nicht mehr atomar, da zwischen open() und fcntl() eine gewisse Zeit liegen kann.
Nun suche ich nach einer Möglichkeit, das ganze so zu realisieren, dass das System auch einen gecrashten Prozess übersteht ohne dauerhaft zu blockieren und gleichzeitig das Lockfile nur zu der Laufzeit der Prozesse vorhanden ist (eine Lösung, wo das Lockfile dauerhaft existiert und nur von Zeit zu Zeit mittels fcntl() gesperrt wird, wollte ich eigentlich nicht haben).
Dazu wollte ich beim Programmstart ein Advisory Lockfile in der dem Verzeichnis anlegen, das verhindert, dass weitere Instanzen des Programmes gleichzeitig laufen (diese sollen nicht auf den laufenden Prozess warten, sondern sich gleich wieder beenden, falls ein anderer Prozess läuft).
Mein erster Ansatz war, das ganze über open() mit O_EXCL zu realisieren. Das funktioniert soweit wie gewollt, hat aber einen Nachteil: Falls das Programm crasht bleibt das Lockfile bestehen und verhindert weitere Programmdurchläufe bis die Datei manuell entfernt wird.
Falls man stattdessen mit fcntl() arbeitet sind die Operationen nicht mehr atomar, da zwischen open() und fcntl() eine gewisse Zeit liegen kann.
Nun suche ich nach einer Möglichkeit, das ganze so zu realisieren, dass das System auch einen gecrashten Prozess übersteht ohne dauerhaft zu blockieren und gleichzeitig das Lockfile nur zu der Laufzeit der Prozesse vorhanden ist (eine Lösung, wo das Lockfile dauerhaft existiert und nur von Zeit zu Zeit mittels fcntl() gesperrt wird, wollte ich eigentlich nicht haben).