Wenn die Daten kostbar sind, dann ist eine Datei als Synchronisation nicht gut genug.
Das ist der Punkt die Daten sind sehr kostbar. Mit der besprochenen Lösung bin ich auf jeden Fall einen Schritt weiter.
Dann solltest Du darüber nachdenken, eine Lösung zu verwenden, die dem Wert der Daten angemessen ist.
Wenn die Daten wirklich "kostbar" sind, also DM XXXXX.- und mehr, würde ich einen Synchronisationsmechanismus verwenden, der kommerziellen Maßstäben genügt - also eine richtige relationale Datenbank (mein Vorschlag: Oracle auf SUN).
Synchronisation quasi-gleichzeitiger Zugriffe ist ein Problem, mit dem sich Datenbankdesigner schon seit 2-3 Jahrzehnten befassen, und das mit ziemlichem Erfolg. Das Transaktionskonzept einer richtigen relationalen Datenbank ermöglich es dem Anwender, das Thema Synchronisation vollkommen auszuklammern - die Datenbank kümmert sich ganz alleine darum, daß die aktuelle Sicht auf die Daten Sinn macht, daß gegenseitiges Überschreiben keine Probleme auslöst etc.
Durch die Diskussion in diesem Thread habe ich ja einiges zur Verwendung von flock() erfahren. Ich habe mir auch schon überlegt, ob es vielleicht eine Möglichkeit gibt (wenn überhaupt sinvoll) die Warteschleife und flock zu kombinieren. Es ist auch noch offen, ein Backup der Datei anlegen zu lassen. Diese Dinge zusammen müßten wohl ausreichen um die Daten so genau wie nur möglich aufzunehmen und zu speichern bzw. wieder zur Verfügung zu stellen.
Wie das nun genau aussehen könnte, weiß ich noch nicht ganz. Vielleicht hat aber noch jemand eine Idee.
Einen solchen Mechanismus brauchst Du in jedem Fall. Wenn Dein Prozeß versucht, das Semaphor zu setzen, und flock() ihm ein FALSE zurückmeldet, dann ist zu erwarten, daß der andere Prozeß noch eine Weile am Arbeiten ist. Und in der Zwischenzeit würdest Du mit weiteren flock()-Versuchen lediglich das System langsamer machen (busy wait).
Also wäre eine Konstruktion der Art
while (flock() == FALSE) {sleep (time)}
empfehlenswert. Den idealen Wert für "time" zu finden, hängt davon ab, wieviel Du über die mittlere Verweildauer Deiner Prozesse weißt - Du willst ja weder zu oft abfragen noch zu lange bis zur nächsten Abfrage warten. Vielleicht ist der ideale Wert sogar nicht konstant, sondern dynamisch zu berechnen, etwa in Abhängigkeit von der bisherigen Wartezeit ...
Generelles Problem: Während Prozeß 2 auf Prozeß 1 wartet, kann Prozeß 3 ebenfalls zu warten beginnen. Wer nach Prozeß 1 als nächster durchkommt, ist Zufall. Die angegebene triviale Schleife stellt nicht sicher, daß Prozeß 2 *jemals* durchkommt (oder gar vor Prozeß 2). Wenn Du die Abfragefrequenz bei längerer Wartezeit erhöhst, verbessserst Du lediglich die Chancen der "alten" Prozesse.
Wenn Du das aber garantieren mußt, dann mußt Du etwas anderes verwenden (eine Warteschlange, beispielsweise über ein UNIX-socket).
Das allgemeine Thema der Prozeßsynchronisation ist so vielfältig, daß man leicht ins Schwafeln kommt, so wie ich gerade ... :-)