Ich hätte ja noch einen etwas ausgefallenen Lösungsvorschlag, der nicht mit Lockfiles, sondern flock arbeitet, trotzdem mit CGIs funktioniert und ein paar Vorzüge hat:
* Teile das Problem in zwei Programme, einen Fileserver und ein CGI.
* Der Fileserver wird als permanenter Serverprozess neben dem Webserver gestartet. Er öffnet einen Unix-Domainsocket und beginnt darauf zu lauschen.
* Das CGI-Programm sendet, anstatt eine Datei selbst zu öffnen, über den Domainsocket eine Anfrage an den Fileserver. Die Anfrage enthält die Information, welche Datei geöffnet werden soll und ob Lese- und / oder Schreibzugriff verlangt wird.
* Der Fileserver erhält die Anfrage, öffnet die Datei mit dem entsprechenden Modus und besorgt sich die nötigen Locks. Wenn eine dieser Operationen fehlschlägt, antwortet er dem CGI-Programm mit einer aussagekräftigen Fehlernachricht. Wenn die Datei erfolgreich geöffnet wurde, merkt sich der Fileserver den Dateideskriptor mit seiner Erstellungszeit in einer internen Liste und schickt ihn dann über den Domainsocket an das CGI-Programm.
* Das CGI-Programm erhält den Dateideskriptor oder die Fehlermeldung als Antwort auf seine Anfrage.
* Das CGI-Programm tut, was es tun soll, oder auch nicht ;-)
* Das CGI-Programm beendet seine Arbeit und schickt dem Fileserver eine Anfrage, den gegebenen Dateideskriptor freizugeben.
* Der Fileserver erhält die Anfrage, schlägt den Deskriptor in seiner internen Tabelle nach, entfernt ihn dort, gibt die Sperren frei und schließt den Deskriptor.
* Parallel durchläuft der Fileserver in vorgegebenen Intervallen die Liste der Deskriptoren und gibt diejenigen wie im letzten Schritt frei, die bereits zu alt sind.
Dieser Ansatz sieht komplizierter aus, als er tatsächlich ist, lässt sich hervorragend in einen Server und eine Bibliothek kapseln, so dass er vom CGI-Programmierer weniger wahrgenommen wird, als die anderen Ansätze und hat den zusätzlichen Vorteil, dass das CGI mit minimalen Privilegien gestartet werden kann, so dass es lediglich über den Fileserver auf lokale Dateien zugreifen kann; der Fileserver aber kann eine Zugriffskontrolle für die Dateien implementieren und die Zugriffe loggen, was die Sicherheit und Kontrollierbarkeit des Gesamtsystemes verbessert.
When C++ is your hammer, every problem looks like your thumb.