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?

Codierer
quelle
2
Sehen Sie, ob Hilfe: stackoverflow.com/questions/5339200/…
enzotib
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.

Stribika
quelle
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 .

Milan Kerslager
quelle
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