Wie macht man eine prozessübergreifende Sperre unter Linux (C / C ++)?


8

Ich muss sicherstellen, dass jeweils nur ein Prozess in einer Instanz ausgeführt wird. Unter Windows können Sie den benannten Mutex verwenden. Aber ich habe keine Ahnung, was ich unter Linux verwenden soll.

Ich glaube, ich habe einen Ansatz gesehen, bei dem die App eine exklusive Datei erstellt, aber ich kann sie nicht mehr finden. Verwenden Sie reguläre Dateifunktionen, Busy-Loop?



Es gibt einen ersten Aufruf von fopen, der versucht, eine möglicherweise gesperrte Datei zu überschreiben. Ist das in Ordnung?
Coder

Es wird in der Antwort erklärt: scheint in Ordnung zu sein.
Enzotib

Mach dir keine Sorgen, stimme dieser Antwort zu.
Enzotib

Antworten:


9

Wenn Sie nur eine Instanz Ihrer App ausführen möchten, können Sie eine Sperrdatei verwenden. Öffnen Sie es mit O_CREAT|O_EXCLFlags und es schlägt fehl, wenn die Datei bereits vorhanden ist.

Wenn Sie den Zugriff auf eine Datei synchronisieren möchten, verwenden Sie flock. Es ist auch möglich, Teile von Dateien mit zu sperren fcntl. Flock dient nur zum empfohlenen Sperren, dh ein Programm kann die Sperren ignorieren und trotzdem darauf zugreifen. Das obligatorische Sperren ist mit möglich fcntl, erfordert jedoch eine spezielle Mount-Option und spezielle Dateiberechtigungen.

semgetund semopkann auch für die Interprozesssynchronisation verwendet werden.


0

Interprozess-Mutexe sind ein optionaler Bestandteil von POSIX (siehe _POSIX_THREAD_PROCESS_SHARED auf der Seite unistd.h ). Da sie unter Linux implementiert sind, können Sie sie auch verwenden - siehe Beispiele .


Hier geht es darum, prozessübergreifende Mutexe zu haben. Ist das ein Teil von POSIX?
Alfe

Ja, es ist einer von mehreren Posix IPC-Mechanismen. Das steht für Interprozesskommunikation, daher besteht die ganze Idee darin, zwischen Prozessen zu kommunizieren. das sieht ziemlich gut aus: chandrashekar.info/articles/linux-system-programming/…
Daniel Farrell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.