Schrift
[thread]7831[/thread]

Mehrere Prozesse gleichzeitig auf eine Datei... (Seite 2)

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Dubu
 2006-03-29 01:35
#64102 #64102
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ah, interessant. Danke, esskar.
Fatso Keratso
 2006-03-30 20:46
#64103 #64103
User since
2006-03-27
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Auf meinem Testrechner läuft MacOS 10.2.8. Da das auch auf einen UNIX Kernel basiert, sollte meinen, daß das hier gleich ist, muß aber sagen, daß ich das hier nicht so genau weiß (bei MacOS Classic verhielt es sich in etwa so, wie bei Windows). Ich vermute der Zielrechner, auf dem die HP läuft ist ein UNIX System.


Also, ich möchte eigentlich die aktuellste Version der Datei mit Prozess B bearbeiten. Und wenn diese gelöscht wurde, würde ich das schon gerne wissen, bevor ich diese auslese. Das größte Risiko stellt ja vermutlich die flock() Funktion dar, da nach der Wartezeit die Datei sich verändert haben kann.

Quote
Dein Test auf Existenz der Datei mit "-e" unterliegt selber wieder einer Race Condition: Ein anderer Prozess kann die Datei nach dem Test und vor dem Öffnen trotzdem löschen.


Aber ist das dann nicht genau die Situation, die ich haben möchte? Prozess A startet, Prozess B muß warten. Prozess A löscht die Datei, während Prozess B darauf wartet, sie bearbeiten zu können. Prozess A hebt die Schutz auf, Prozess B ist am Zug. Der hat die Datei ja wiederum geschützt, also kann ein etwaiger Prozess C nix tun. Ich prüfe, ob die Datei noch existiert, und merke sie existiert nicht. Also spare ich mir das auslesen, weil die Daten des filehandles "veraltet" sind. Hebe den Schutz auf, Prozess C kann das gleiche tun.

Der andere Fall ist: Prozess A schreibt eine neue Version der Datei, während Prozess B im Lock ist, Prüfung der Dateiexistens ist positiv, also kann Prozess B die Daten auslesen. Frage: Liest er jetzt eigentlich die modifizierte Version, der Prozess A gerade geschrieben hat (also nach open, während flock() von Prozess B), auch mit korrekten EOF? Wenn ja ist ja alles perfekt, ich bekomme die aktuellsten Daten in jedem Falle.

Worauf ich hinaus will ist folgendes, korrigiert mich, wenn es nicht stimmt. Da ich immer schön mit flock() arbeite, kann die Race Condition nicht ziehen, da flock() immer wartet, das heißt, die Prozesse nacheinander bearbeitet werden. Eine Datei hat immer den Exclusiven Schutz, während alle Anderen warten müssen. Stimmt das?

Vielen Dank noch mal.

PS: Was genau ist eigentlich eine Race Condition, bzw wie funktioniert das?
GwenDragon
 2006-03-30 21:04
#64104 #64104
User since
2005-01-17
14603 Artikel
Admin1
[Homepage]
user image
Dubu
 2006-03-31 00:02
#64105 #64105
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Fatso Keratso,30.03.2006, 18:46]Worauf ich hinaus will ist folgendes, korrigiert mich, wenn es nicht stimmt. Da ich immer schön mit flock() arbeite, kann die Race Condition nicht ziehen, da flock() immer wartet, das heißt, die Prozesse nacheinander bearbeitet werden. Eine Datei hat immer den Exclusiven Schutz, während alle Anderen warten müssen. Stimmt das?[/quote]
Das stimmt wohl. Wenn alle Prozess erst flock() aufrufen, bevor sie etwas mit der Datei machen, ist es sicher.
Ein Risiko gibt es nur durch andere Prozesse, die das Advisory Lock ignorieren.
Fatso Keratso
 2006-03-31 05:51
#64106 #64106
User since
2006-03-27
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eigentlich handelt es sich bei den Prozessen immer um das gleiche Skript, was mehrfach ausgeführt werden. Da habe ich die volle Kontrolle und kann dafür sorgen, daß das flock() konstant benutzt wird. Es gibt ein Objekt für die Dateiverwaltung, das wird entsprechend optimiert. Bin gespannt, ob s funktioniert.

Auf jeden Fall vielen Dank an alle, die mir hier jetzt geholfen haben. Es hat mir alles weitergeholfen und war für mich auch mal wieder ein interessantes Gedankenkonzept - für euch vielleicht nicht, aber darum geht es ja auch in einem Forum - alle helfen allen weiter :)...
pq
 2006-03-31 12:41
#64107 #64107
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Fatso Keratso,30.03.2006, 18:46]Das größte Risiko stellt ja vermutlich die flock() Funktion dar, da nach der Wartezeit die Datei sich verändert haben kann.[/quote]
du lockst die datei doch zuerst und liest sie erst dann. dann kriegst du
auch den aktuellen inhalt...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Fatso Keratso
 2006-03-31 15:02
#64108 #64108
User since
2006-03-27
18 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja, habe ich wohl etwas mißverständlich ausgedrückt. Vielleicht bringe ich auch die verschiedenen Probleme des Skriptes durcheinander. Ich hatte nämlich zwei:

1.) Dateien wurden ständig zurückgesetzt, oder enthielten fehlerhafte Daten, obwohl ich flock() benutzt habe. Hauptursache war die Art und Weise, mit der ich Dateien bearbeitet habe: Öffnen, Daten lesen und Schließen. Daten bearbeiten, Dateien zum Schreiben öffnen, Schreiben, Schließen. Das Problem habe ich mit der Wiki "WieSperreIchEineDatei" gelöst.

2.) Das hier diskutierte Problem bezieht sich nur auf das Löschen der Datei, während ein anderer Prozess diese offen hält. Da kann es eben sein, daß nach dem flock() die Datei gar nicht mehr vorhanden ist, aber für dieses Problem ist die Lösung glaube ich jetzt gefunden. :)
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-03-27 16:16.