2009-04-22 9 views
5

Wenn einer meiner Prozesse eine Datei öffnet, sagen wir nur zum Lesen, garantiert das Betriebssystem, dass kein anderer Prozess darauf schreiben wird, während ich lese, vielleicht den Lesevorgang mit dem ersten Teil von verlassen die alte Dateiversion und der zweite Teil der neueren Dateiversion, was die Datenintegrität fraglich macht?Dateien auf mehreren Prozessen

Ich spreche nicht über Rohre, die keine Suche haben, aber auf regulären Dateien, mit Suchoption (zumindest wenn mit nur einem Prozess geöffnet).

Antwort

3

Nein, andere Prozesse können den Inhalt der Datei ändern, wie Sie es lesen:

Unter Linux können Sie eine beratende Sperre für eine Datei mit hinzufügen. Versuchen Sie, "man fcntl" auszuführen und ignorieren den Abschnitt über "Advisory" -Sperren; das sind "optionale" Sperren, auf die Prozesse nur dann achten müssen, wenn sie es wollen. Suchen Sie stattdessen nach den obligatorischen Sperren (leider nicht POSIX). Diese sind diejenigen, die Sie vor anderen Programmen schützen. Versuchen Sie eine Lesesperre.

+0

Obligatorische Sperren sind meiner Meinung nach kein wünschenswertes Feature :) – MarkR

+0

Einverstanden! Ein besseres Anwendungsdesign wäre vorzuziehen. Aber wenn er eine Akte gegen Leser schützen muss, die er nicht kontrollieren kann, sind sie nur ein Weg zu gehen. –

2

Nein, wenn Sie eine Datei öffnen, können andere Prozesse darauf schreiben, es sei denn, Sie verwenden eine Sperre.

#include <sys/file.h> 

... 

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock 
+2

Advisory Locks sind nicht nützlich, es sei denn, die Schreibanwendung stimmt auch zu, sie zu verwenden. –

+0

Advisory Locks sind ausreichend, wenn Sie sicher sind, dass jeder Beteiligte sich an sie hält. Beachten Sie auch mögliche Deadlock-Probleme, wenn ein Prozess blockiert, während auf die Freigabe einer Sperre gewartet wird. – jiggy

+2

Obligatorische Sperren sind nicht immer möglich. Beispielsweise müssen Sie mount möglicherweise mit "-o mand" ausführen und einige Flags in der Datei ändern. – Zifre

2

Jeder Prozess, der die Datei zum Schreiben öffnen kann, kann darauf schreiben. Schreibvorgänge können gleichzeitig mit Ihren eigenen Schreibvorgängen erfolgen, was zu (möglicherweise) unbestimmten Zuständen führt.

Es ist Ihre Verantwortung als Anwendungsautor, sicherzustellen, dass keine schlechten Dinge passieren. Meiner Meinung nach ist das obligatorische Sperren keine gute Idee.

Eine bessere Idee ist es, keinen Schreibzugriff auf Prozesse zu gewähren, die nicht in die Datei geschrieben werden sollen.

Wenn mehrere Prozesse eine Datei öffnen, verfügen sie über unabhängige Dateizeiger, sodass sie sich gegenseitig suchen() und sich gegenseitig nicht beeinflussen können.

Wenn eine Datei von einem Thread-Programm (oder einer Task, die ihre Dateideskriptoren gemeinsam benutzt) geöffnet wird, wird der Dateizeiger ebenfalls freigegeben. Sie müssen also eine andere Methode verwenden, um auf die Datei zuzugreifen, um Rennen zu vermeiden Bedingungen, die Chaos verursachen - normalerweise pread, pwrite oder die Scatter/Gather-Funktionen readv und writev.

Verwandte Themen