Schrift
[thread]712[/thread]

flock funktioniert nicht (Seite 4)



<< |< 1 2 3 4 5 6 7 >| >> 65 Einträge, 7 Seiten
master
 2006-04-18 17:16
#7365 #7365
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Guter Artikel um das Problem zu verstehen:
Race Conditions
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
pq
 2006-04-18 17:23
#7366 #7366
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=master,18.04.2006, 15:14]Trotzallem sollte man "sysopen" nutzen... [/quote]
wieso?
Quote
Es ist einfach besser als ein simples open < >  +< wie auch immer...

wieso denn? außer das sysopen das flag O_EXCL kennt (was manchmal
nützlich sein kann, aber nicht immer gebraucht wird), fällt mir da nix ein.
Quote
Zudem gabs hier im forum schon oft user die das Problem mit
open, flock usw. hatten.

ja, welches problem gabs denn da? genau, die leute öffnen die datei
zum lesen, leesen sie, schließen und öffnen wieder. ja, kein wunder.
ansonsten frage ich mich, welche probleme es mit einem code gibt, der
flock korrekt benutzt?
Quote
schau dich mal etwas um, dann siehst du, dass es nicht blos heisse luft ist.

oh, ich soll mich umschauen? siehe da, ich habe was gefunden...
na sowas, der wiki-eintrag ist ja von mir selbst...
Wiki:Wie sperre ich eine Datei?
Quote
ps. ich öffnete früher immer mit "<" daher bekam ich damals trotz flock race-conditions

ja, das mag sein.
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
master
 2006-04-18 17:27
#7367 #7367
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@pq
das problem ist, das ">" oder "<" ne datei anlegt, falls sie nicht exisitert. +< macht das ja nicht, Dort passiert nix, wenn die datei nicht exisitert.

Zudem kann eine race condition trotzdem auftreten....
schau dir den Artikel an..

Prozess 1 öffnet, Zähler =0
Prozess 2 öffnet, Zähler = 0

Prozess 1 schreibt, flockt, addet und schreibt, Zähler =1
Prozess 2 schreibt, flockt, addet und schreibt, Zähler = 1

obwohl eigentlich der zähler bei Prozess 2 auf 2 sein sollte..
Das problem ist simpel. man müsste eben die datei gleichzeitig öffnen + flocken

Zudem darf prozess 2 dann nur schreiben, wenn nicht geflockt.
(sollte eh so sein)

open(was aich immer, wie auch immer "< > +<" )
und erst dann ein flock = gefahr der racecondition

klar ist +< sicherer als <, aber eben, fehler können trotzdem auftreten. z.b. das der counter nicht zählt...
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-18 17:32
#7368 #7368
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@pq

Sysopen:
1. schneller
2. sicherer
3. Die Datei wird nur dann überschrieben wenn du es willst.

Es gibt auch dort ein Anhängen, flocken usw.

Ich habe mich vor einiger Zeit intensiv mit sysopen auseinander gesetzt.


Hier ein schönes zitat dazu
Quote
Die Logik zwischen den Zeilen 44 und 49 ist hingegen narrensicher: Der sysopen()-Befehl kann eine Datei gleichzeitig zum Lesen und Schreiben öffnen und sie auch noch erzeugen, falls sie noch nicht existiert - und das Ganze atomar, also ohne dass jemand dazwischenfunken kann. Das normale open() könnte das nicht.

Hier der Link:
zitat\n\n

<!--EDIT|master|1145368062-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
pq
 2006-04-18 17:47
#7369 #7369
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=master,18.04.2006, 15:27]schau dir den Artikel an..[/quote]
sorry, ich habe lange genug in informatik-vorlesungen gesessen, ich
mag sowas nicht mehr lesen.
ich hatte dir ja meinen beispielcode gepostet. du bist nicht bereit, diesen
zu nehmen und das problem daran zu demonstrieren, indem du die
situation nachstellst.
Quote
Prozess 1 öffnet, Zähler =0
Prozess 2 öffnet, Zähler = 0

Prozess 1 schreibt, flockt, addet und schreibt, Zähler =1
Prozess 2 schreibt, flockt, addet und schreibt, Zähler = 1

du darfst eine nacht drüber schlafen und das morgen nochmal angehen,
das ist ziemlicher unsinn, den du da schreibst.

ich demonstriere dir mal ein problem ohne flock:
dateiinhalt: 1
P1 öffnet
P2 öffnet
P1 liest zeile, $count==1
P2 liest zeile, $count==1
P2 inkrementiert, $count==2
P1 inkrementiert, $count==2
P2 schreibt 2
P1 schreibt 2
P2 schließt
P1 schließt

mit flock kein problem:
P1 öffnet
P2 öffnet
P1 flockt
P2 versucht flock---
P1 liest zeile, $count==1
P1 inkrementiert, $count==2
P1 schreibt 2, schließt
P2 flockt
P2 liest zeile, $count==2
P2 inkrementiert, $count==3
P2 schreibt 3, schließt


edit: s/2/3/\n\n

<!--EDIT|pq|1145368941-->
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
pq
 2006-04-18 17:54
#7370 #7370
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=master,18.04.2006, 15:32]Sysopen:
1. schneller[/quote]
ok, mag sein. hast du ne stelle in der doku?
wieviel mag das wohl ausmachen? benchmarks?
Quote
2. sicherer

stelle in der doku? so pauschal lehne ich die behauptung jetzt erstmal ab.
Quote
3. Die Datei wird nur dann überschrieben wenn du es willst.

was ist das für eine aussage? mit open() wird die datei auch nur dann
überschrieben, wenn du es willst. siehe mein beispiel, das du ja gern
ignorierst.
Quote
Hier ein schönes zitat dazu
Quote
Die Logik zwischen den Zeilen 44 und 49 ist hingegen narrensicher: Der sysopen()-Befehl kann eine Datei gleichzeitig zum Lesen und Schreiben öffnen und sie auch noch erzeugen, falls sie noch nicht existiert - und das Ganze atomar, also ohne dass jemand dazwischenfunken kann. Das normale open() könnte das nicht.

nein, ein normales open kann nicht gleichzeitig zum lesen und schreiben
öffnen und erzeugen. das stimmt. aber darum ging es ja hier nicht.
hier geht es z.b. um eine counter-datei, die schon existiert.
und flock ist atomar. das open davor kümmert mich kein bißchen, da
ich ja nach dem open den inhalt noch nicht gelesen habe. das wurde dir
aber auch schon in diesem thread gesagt.

bist du ein troll?
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
master
 2006-04-18 18:07
#7371 #7371
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@PQ Naja mag ja stimmen..
Aber nur wenn man auf ein erfolgreiches Flock auch prüft...

ausserdem ging es mir eigentlich um x-mas.-code.
und der hat eindeutig race conditions.. alleine schon beim (unflock), <zeit>, close

Vom prinzip her ist ja schon die Idee des open und danach flock nicht korrekt. noch schlimmer unflock, close
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-18 18:10
#7372 #7372
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@pq
opensys = schneller
Quote
ok, mag sein. hast du ne stelle in der doku?
wieviel mag das wohl ausmachen? benchmarks?

Hatte ich mal....Naja, die müssten wir erst neuerstellen..
bzw. hatte den lifetest.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
pq
 2006-04-18 18:12
#7373 #7373
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
ok, master, wenn es dich sonst unglücklich macht... du hast recht, und wenn du unrecht hast, hast du recht.
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
master
 2006-04-18 18:47
#7374 #7374
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@pq
genau.... *lach*


Natürlich mit autoflush = 1
Code: (dl )
1
2
Zeit: 7    #sysopen
Zeit: 10 #open


zudem hat man bei syswirte die möglichkeit mit dem offset zu arbeiten... Im normalen open muss man dann den seek angeben,\n\n

<!--EDIT|master|1145372147-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
<< |< 1 2 3 4 5 6 7 >| >> 65 Einträge, 7 Seiten



View all threads created 2006-04-17 19:11.