steve: FLOCK - Betriebssystem

Hallo zusammen,

unter Perl schreibe ich in eine Textdatei mit den Befehlem OPEN und PRINT. Nun möchte ich nach OPEN den FLOCK Befehl einsetzen:

my $gBSUNIX = 1;
if ($gBSUNIX) {flock($_[0], 2) || die("can't lock file, $!");}

Bis jetzt habe ich immer eine Variable eingesetzt.

Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom Betriebssystem unterstützt wird?

Danke im voraus

  1. Tag steve.

    Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom Betriebssystem unterstützt wird?

    Nein, das tut Perl für dich, da flock zu den eingebauten Funktionen von Perl gehört. Du kannst nur auf den Rückgabewert reagieren, z.B. so, wie du es schon getan hast. Es geht allerdings auch eleganter, ändert aber nichts an der Vorgehensweise.

    Siechfred

    1. Hi Siechfred,

      danke dir !

      Habe noch folgende Frage:

      Wenn ich aus einer Textdatei nur einen Wert lese, sollte man dann die Datei dann auch sperren (LOCK_SH / Shared Lock)

      Was bringt das bei reinen Lesen?

      bye

      Steve

      1. 你好 Steve,

        Wenn ich aus einer Textdatei nur einen Wert lese, sollte man dann die
        Datei dann auch sperren (LOCK_SH / Shared Lock)

        Was bringt das bei reinen Lesen?

        Wenn die Datei wirklich _immer_ nur gelesen wird, kannst du den Lock
        weglassen. Wird sie aber auch geschrieben, dann solltest du sie sperren,
        damit du nicht irgendwelchen Müll einliest. Beispiel:

        Prozess a öffnet die Datei zum lesen, sperrt sie aber nicht. Nahezu
        zeitgleich öffnet Prozess b die Datei zum schreiben und schreibt etwas
        hinein, wird aber mitten im Schreib-Prozess vom Scheduler schlafen
        geschickt. Prozess a liest nun weiter und liest die unvollständigen Daten
        von Prozess b. Und schon hast du einen sehr schwer zu entdeckenden Bug in
        deinen Scripten. Schwer zu entdecken ist er, weil er (ohne viel Erfahrung)
        nicht reproduzierbar ist.

        再见,
         克里斯蒂安

        --
        Buchpreisbindung? | Plasma-Bildschirm geklaut
        Sobald dir ein Gedanke kommt, lache über ihn.
        http://wwwtech.de/
        1. Hi,

          in der Sub 1 lese ich nur die Datei xyz.txt

          in der Sub 2 lese und schreibe ich in die Datei xyz.txt

          Dann ist es wohl besser wenn ich in Sub 1 auch die Datei mit LOCK_SH sperre, auch wenn ich nur Lese.

          Bitte verbessere mich im Fehlerfall...

          Bye

          steve

          1. Moin.

            in der Sub 1 lese ich nur die Datei xyz.txt
            in der Sub 2 lese und schreibe ich in die Datei xyz.txt

            Annahme: Dein Script läuft als ein Prozess, es gibt an keiner Stelle ein fork(). Dann können Sub1 und Sub2 nie gleichzeitig laufen.

            Und wenn Du sicherstellen kannst, daß Dein Script nur einmal aufgerufen werden kann, also niemals (!) ein zweites parallel läuft bzw. ein anderes Script auf die Daten zugreift, dann brauchst Du nicht einmal beim schreiben zu locken. Wer sollte das Schreiben dann unterbrechen?

            ABER: Kannst Du verhindern, daß zwei User gleichzeitig Dein Script starten...?

            Deshalb --> lock ist Pflicht!

            Gruß Frank

  2. 你好 steve,

    Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom
    Betriebssystem unterstützt wird?

    Jupp, Perl überprüft das für dich:

      
    use Config;  
    use Carp qw/croak/;  
      
    our $has_flock = 1;  
      
    if(!$Config{'d_flock'} || $Config{'d_flock'} ne 'define') {  
      carp "Sorry, system doesn't have flock(2)! Locking will be unsafe!\n"  
      $has_flock = 0;  
    }  
    
    

    再见,
     克里斯蒂安

    1. Hi Christian,

      kann ich dann einfach nur schreiben:

      flock($_[0], 2);

      Wenn das Betriebssystem das Sperren nicht unterstützt wird der Befehl einfach ignoriert.

      Oder sollte man mit deiner Abfrage vorher prüfen, ob flock unterstütz wird.

      Bye

      Steve

      1. 你好 Steve,

        Hi Christian,

        kann ich dann einfach nur schreiben:

        flock($_[0], 2);

        Wenn das Betriebssystem das Sperren nicht unterstützt wird der Befehl
        einfach ignoriert.

        flock() produziert einen fatalen Laufzeitfehler, wenn es auf der Maschine
        nicht implementiert wird. Ergo: besser prüfen und nur ein bedingtes flock(),
        sonst beendet sich dein Script mit einer bösen Meldung.

        Alternative: eval {flock($_[0],2);} und auf $@ prüfen. Wenn nach dieser
        Anweisung $@ einen wahren Wert enthält, ist flock() auf der Maschine nicht
        implementiert.

        再见,
         克里斯蒂安

        --
        Buchpreisbindung? | Plasma-Bildschirm geklaut
        Der Verstand ist der Hausherr, der Koerper sein Gast.
        http://wwwtech.de/
        1. Hi Christian,

          danke Dir !

          Weiter unten habe ich gefragt ob man auch bei reinen Lesebefehlen die Datei sperren soll?

          Ich habe mal gelesen,, man sollte dieses tun. Aber was gibt das für einen Sinn?

          Bye

          Steve