2 Stimmen

Ist die Verwendung von tellp mit Dateisperren sicher?

Die allgemeine Strategie für Boost-Dateisperren (sharable und scoped file_locks), und Dateisperren im Allgemeinen denke ich, ist dies:

  1. öffnen
  2. sperren
  3. auf den Inhalt der Datei einwirken
  4. freischalten
  5. die Datei schließen

Ich werde jedoch die Datei zum Anhängen öffnen und möchte tellp aufrufen, um zu sehen, wo ich mich befinde. Ist dies in dem obigen Szenario sicher zu tun? Wird der Dateizeiger nicht gesetzt, sobald die Datei vor der Sperre geöffnet wird und somit möglicherweise nicht geschützt ist? Wenn ja, gibt es ein Standard-Idiom, um dies zu umgehen?

1voto

Ben Voigt Punkte 268424

Dies kann zwar umgebungsspezifisch sein, ist aber auf den meisten Plattformen der Fall:

Wenn eine Datei zum Anhängen geöffnet wird, wird der Dateizeiger unmittelbar vor jedem Schreibvorgang angepasst. Wenn Sie also tellp bevor Sie die Datei sperren, kann es Ihnen nicht sagen, wohin die neu angehängten Bytes gehen werden, aber Sie sollten nicht zwei Prozesse haben, die irgendwie sperren und trotzdem denselben Bereich von Bytes anhängen.

0voto

peenut Punkte 3255

Ich empfehle eine gute Boost-Dokumentation: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock

Darin können Sie lesen:

  • Dateisperren sind keine Betriebssystemsperren, auch wenn das Betriebssystem sie unterstützt (z.B. Windows ja, Unix-ähnliche normalerweise nicht). Wenn Sie also eine Datei sperren, kann jeder sie lesen/schreiben/löschen, es sei denn, ein anderer Prozess verwendet denselben Dateisperrmechanismus. Betrachten Sie es also eher als prozessübergreifende Mutexe denn als echte Dateisperren.
  • Dateisperren dienen der Synchronisierung zwischen Prozessen, sie synchronisieren nicht mehrere Threads innerhalb eines Prozesses
  • Vergessen Sie nicht das Flushing (ofstream's flush), damit Sie sich nicht um die Pufferung kümmern müssen

Oh, das ist einfach schrecklich... Ich wollte helfen, ich habe Beispielcode geschrieben, versuchen Sie es und ... ab 1_44 Dateisperren ist für win32 gebrochen, Flushing funktioniert nicht auf gesperrte Datei.

Tut mir leid, nicht meine Schuld.

Wenn es hilft, in der Theorie: Wenn Sie eine Datei zum Anhängen öffnen, bedeutet dies, dass vor jedem Schreibvorgang automatisch nach dem Ende gesucht wird. Das hindert Sie nicht daran, jederzeit manuell nach dem Ende zu suchen - auch ohne zu schreiben. Die Erfahrung (siehe oben) sagt jedoch: Halten Sie sich von kaputten Dingen fern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X