Maik Görgens: flock() auch beachten

Hallo!

Es gibt ja den Befehl flock() in Perl.
Wie ich eine Datei vor doppelten Zugriffen schütze weiß ich ja inzwischen.
In SELFHTML steht nun aber, das es sich auch andere Prozesse an das flock halten müssen, damit es Sinn hat. Meine Frage nun, wie bring ich meinem Script bei, das es sich daran halten soll, und erst dann eine Datei öffnet, wenn diese wieder freigegeben wurde. Tut Perl das automatisch, oder muß ich extra sagen: "Warte bis wieder frei ist, und dann mache das und das..."?

Kann mir da jemand helfen? Gibt es vielleicht sogar Tutorials, die sich ein wenig mehr mit flock() beschäftigen, weil ich finde, das das in SELFHTML ein bißchen kurz gekommen ist (naja, vielleicht gibts ja auch nicht unbedingt mehr dazu zu erzählen).

Na denn, vielen Dank und Gruß
Maik

  1. Servus,

    mehr zu flock unter ...
    http://www.perldoc.com/perl5.8.0/pod/func/flock.html

    Afaik hält sich Perl da automatisch dran. Aber das kannst du ja ganz einfach testen indem du auf eine gesperrte Datei mit einem anderen Perlscript zugreifst.

    cya
    ME

  2. Hi,

    In SELFHTML steht nun aber, das es sich auch andere Prozesse an das flock halten müssen, damit es Sinn hat. Meine Frage nun, wie bring ich meinem Script bei, das es sich daran halten soll, und erst dann eine Datei öffnet, wenn diese wieder freigegeben wurde. Tut Perl das automatisch, oder muß ich extra sagen: "Warte bis wieder frei ist, und dann mache das und das..."?

    Am besten machst du es so, wenn du eine Datei einlesen willst, setzt du einen shared_lock, so dass währenddessen gelesen werden kann. Wenn du aber schreiben willst, setzt du einen exklusiven lock, so das niemand währenddessen lesen kann, es könnte ja erst ein Teil der Daten geschrieben worden sein, so dass das Ergebnis schwachsinn ist. Natürlich kann während eines exklusiven locks auch nicht geschrieben werden.
    Allerdings solltest du umbedingt darauf achten, die Locks so kurz wie möglich zu halten, dh. die Datei öffnen, etwas schreiben/lesen, die Datei wieder schließen, und nicht währenddessen noch dein halbes Script ablaufen lassen, da sonst ein parralel laufendes Script auf den Lock warten muss.

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
  3. Hi,

    Ich schreib mal in dem Thread hier weiter, der andere ist sinnlos.

    Haben meine Programme einen Fehler, oder beachtet Perl doch nicht, wenn ich eine Datei geschützt habe? Kann mir da noch einmal jemand helfen? Weiß jemand, wie ich ein Programm dazu bringe, das es beachtet, wenn eine Datei mit flock geschützt wurde?

    Doch, aber du musst, wie ich dir auch schon in dem anderen Post gesagt habe, immer einen Lock setzten. Egal in welchem Script. Das heißt, du müsstest in dem Script, das die Daten schreibt auch einen lock setzten. Sinnvollerweise einen exklusiven, da solange du schreibst, nicht gelesen werden darf, da es ja sein kann, dass du während du liest, noch nicht alles geschrieben ist. Während des lesens musst du einen shared lock setzten, damit die datein während des lesens nicht verändert werden darf.
    Aber das hättest du alles auch erfahren können, wenn du "perldoc -f lock" zu rate gezogen hättest.

    PS: du bindest doch schon fcntl ein, warum benutzt du dann die richtigen Namen (LOCK_SH, LOCK_EX, LOCK_UN) nicht?

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|