gary: Verhalten bei flock/LOCK_EX

Morgen zusammen,

Wenn ein PerlScript von Client#1 aus dem Internet aufgerufen wird, und dieses Script eine Datei öffnet um mit Ihr zu arbeiten, kann mittels flock diese Datei exclusiv geöffnet werden, und ist für andere Zugriffe somit gesperrt.

Jetzt könnte ein Client#2 ohne Probleme das gleiche Script aufrufen. Wenn nun dieses Script ebenfalls auf diese Datei vom ersten Script zugreifen will, geht das ja solange nicht, wie die exclusive geöffnet ist.

Jetzt meine Frage: Was passiert, wenn dieser Fall eintritt. Wartet das zweite Script automatisch bis es zugreifen kann, oder produziert es eine Fehlermeldung im Sinne von :"Sorry - File already open?

Viele Grüse gary

  1. Jetzt meine Frage: Was passiert, wenn dieser Fall eintritt. Wartet das zweite Script automatisch bis es zugreifen kann, oder produziert es eine Fehlermeldung im Sinne von :"Sorry - File already open?

    Was sagen die Dokumentationen über Flock dazu?

    Struppi.

    1. Morgen Struppi *verneig*,

      Doku:

      Nummer 4 oder Konstante LOCK_NB bedeutet non-blocking (nur in Verbindung mit 1 oder 2 bzw. LOCK_SH oder LOCK_EX erlaubt und beendet den Zugriffsversuch auf die Datei sofort statt zu warten, bis ein Zugriff möglich ist).
                                 ^^^^

      1:0 für dich, wenn man den Lock_NB Befehl durch liest, den ich aber nicht brauche, steht hinten was von warten *jetzt hol ich doch meine Brille*.

      Was noch irritiert:
      [...]kein anderer Prozess, der flock beachtet, gleichzeitig in die Datei schreiben.

      Wenn ich die Kombination:

      open(DATENDATEI, "</db/daten.csv");
      flock(DATENDATEI, LOCK_EX);

      habe, und mit der selben nochmals arbeite, beachte ich doch flock, oder nicht?

      Gruss Gary

      1. Hallo,

        open(DATENDATEI, "</db/daten.csv");
        flock(DATENDATEI, LOCK_EX);

        Das führt zwar zu keinerlei race conditions, aber warum willst Du ein exclusive lock auf eine Datei, die Du *ausschließlich* zum lesen geöffnet hast? Ein shared lock würde da doch vollkommen ausreichen.

        Ansonsten: Siehe meinen Artikel, insbesondere auch den Abschnitt über häufige Fehler.

        Viele Grüße,
        Christian

        1. open(DATENDATEI, "</db/daten.csv");
          flock(DATENDATEI, LOCK_EX);

          Das führt zwar zu keinerlei race conditions, aber warum willst Du ein exclusive lock auf eine Datei, die Du *ausschließlich* zum lesen geöffnet hast? Ein shared lock würde da doch vollkommen ausreichen.

          Nein Christian

          Ein Shared Lock hat Nichts damit zu tun, dass ich eine Datei nur mal gerade zum Lesen geöffnet wird !!!

          mfg Beat

          --
          Selber klauen ist schöner!
          1. Hallo,

            Das führt zwar zu keinerlei race conditions, aber warum willst Du ein exclusive lock auf eine Datei, die Du *ausschließlich* zum lesen geöffnet hast? Ein shared lock würde da doch vollkommen ausreichen.

            Nein Christian

            Ein Shared Lock hat Nichts damit zu tun, dass ich eine Datei nur mal gerade zum Lesen geöffnet wird !!!

            Wenn ich eine Datei *ausschließlich* zum Lesen öffne (also Moduls '<' in Perl oder O_RDONLY in open(2)-Terminologie), welche Vorteile bietet dann ein exclusive lock gegenüber einem shared lock?

            Wenn ich eine Datei auslesen und dann ändern will, *dann* brauche ich ein exclusive lock. Das nützt mir aber gar nichts, wenn ich die Datei *nur* zum Lesen geöffnet habe, weil ich sie dann schließen und wieder öffnen müsste, um sie wieder beschreiben zu können, was zu einer anderen race condition führt - weswegen man in dem Fall die Datei zum Lesen *und* Schreiben öffnet ('<+' bzw. O_RWDR). Das war aber hier nicht der Fall.

            Daher: Inwiefern war mein Einwand ungerechtfertigt?

            Viele Grüße,
            Christian

            1. Hallo,

              Das führt zwar zu keinerlei race conditions, aber warum willst Du ein exclusive lock auf eine Datei, die Du *ausschließlich* zum lesen geöffnet hast? Ein shared lock würde da doch vollkommen ausreichen.

              Nein Christian

              Ein Shared Lock hat Nichts damit zu tun, dass ich eine Datei nur mal gerade zum Lesen geöffnet wird !!!

              Wenn ich eine Datei *ausschließlich* zum Lesen öffne (also Moduls '<' in Perl oder O_RDONLY in open(2)-Terminologie), welche Vorteile bietet dann ein exclusive lock gegenüber einem shared lock?

              A liest X nonblocking
              B liest X nonblocking
              A schreibt X blocking
              B schreibt X blocking

              Bitte das ist ein Standard-Fehler.

              Wenn ich eine Datei auslesen und dann ändern will, *dann* brauche ich ein exclusive lock.

              Danke, der Hinweis hätte fett in der Nachricht stehen sollen, die meinen Einwand provozierte.

              Aber deine Methode halte ich dennoch für mangelhaft und kaum gerechtfertigt in dem Thema und der Kenntnisstufe des betreffenden Perl-Autors.

              Es gibt zudem Schreibzugriffe mit Methoden aus Modulen, für die du ein Dummifile brauchst. Spätestens hier erachte ich das 'manuelle' individuelle setzen von flock auf einzelne Files für problematisch und es ist eine generelle Lösung mit einem lockfile gefragt.

              mfg Beat

              --
              Selber klauen ist schöner!
              1. Hello,

                Es gibt zudem Schreibzugriffe mit Methoden aus Modulen, für die du ein Dummifile brauchst. Spätestens hier erachte ich das 'manuelle' individuelle setzen von flock auf einzelne Files für problematisch und es ist eine generelle Lösung mit einem lockfile gefragt.

                Das ist schmuddelig.
                In einer Umgebung, bei der unterschiedliche Applikationen auf einen gemeinsamen Datenbestand zugreifen können sollen, ist die Dummy-Methode höchst ungeeignet. Das Flag ist am betroffenen Objekt besser aufgehoben.

                Daten von Modulen, die so schmuddelig geschreiben sind, wie Du es beschreibst, können in einem Shared Environment nicht bereitgestellt werden, ohne dass man mandatorisch eine gemeinsame Zugriffsschicht einführen würde. Aber warum soll man etwas zusätzlich einführen, was im Betriebssystem (Filesystem) schon implementiert ist? Da ist es doch sowieso am besten aufgehoben!

                Und eben aus diesem Grund finde ich das mandatory Locking auch die elegantere Lösung. Da kommt KEIN Prozess dran vorbei, der den ordentlichen Weg über das OS geht und nicht seine eigenen Device-Treiber mitbringt.

                Ich habe bei mir daher immer DIO eingerichtet. Mich würde nun nur interessieren, ob das wesentlich mehr Ressourcen verschlingt, als advisory Locking und was in PHP sonst noch der Unterscheid ist.

                Vielleicht das Buffering?

                Ein harzliches Glückauf

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Es gibt zudem Schreibzugriffe mit Methoden aus Modulen, für die du ein Dummifile brauchst. Spätestens hier erachte ich das 'manuelle' individuelle setzen von flock auf einzelne Files für problematisch und es ist eine generelle Lösung mit einem lockfile gefragt.

                  Das ist schmuddelig.
                  In einer Umgebung, bei der unterschiedliche Applikationen auf einen gemeinsamen Datenbestand zugreifen können sollen, ist die Dummy-Methode höchst ungeeignet. Das Flag ist am betroffenen Objekt besser aufgehoben.

                  Mach ein Backup über viele Files, während aus dem Netz mehrere Lese- und Schreib-Zugriffe stattfinden.

                  Wie sieht dein Backup aus, vielleicht konsistent, vielleicht nicht...

                  mfg Beat

                  --
                  Selber klauen ist schöner!
                  1. Hello,

                    Mach ein Backup über viele Files, während aus dem Netz mehrere Lese- und Schreib-Zugriffe stattfinden.

                    Wie sieht dein Backup aus, vielleicht konsistent, vielleicht nicht...

                    Mein Backup sieht sicher ordentlich aus, da ich während des Backups die Datenveränderung unterbinde. Anderenfalls müsste ich ein Transaktionslog führen und dieses sichern. Dann könnte ich, ausgehend von der letzten gesicherten (Voll-)Sicherung den aktuellen Zustand wiederherstellen.

                    Und da meine 10 Mittags-Alzheimer-Minuten eben erst Mittag kommen, weiß ich im Moment auch, dass auf dem Linux-Host mit "cp -p" auch die Fileattribute erhalten bleiben.

                    Mir dünkt, dass Du eine falsche Vorstellung von zeitlichen Abläufen entwickelst.

                    Ein harzliches Glückauf

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
              2. Hallo,

                Wenn ich eine Datei *ausschließlich* zum Lesen öffne (also Moduls '<' in Perl oder O_RDONLY in open(2)-Terminologie), welche Vorteile bietet dann ein exclusive lock gegenüber einem shared lock?

                A liest X nonblocking
                B liest X nonblocking
                A schreibt X blocking
                B schreibt X blocking

                Bitte das ist ein Standard-Fehler.

                Bittewas? Was hat denn blocking / nonblocking mit shared / exclusive zu tun?

                Und wenn Du wirklich shared / exclusive statt nonblocking / blocking meinst: Da produzierst Du genauso eine race condition beim erneuten Öffnen der Datei, wenn Du sie ursprünglich *nur* zum Lesen geöffnet hast, wie das hier der Fall war (ich wiederhole mich...)

                Wenn ich eine Datei auslesen und dann ändern will, *dann* brauche ich ein exclusive lock.

                Danke, der Hinweis hätte fett in der Nachricht stehen sollen, die meinen Einwand provozierte.

                Zitat:

                | Ansonsten: Siehe meinen Artikel, insbesondere auch den Abschnitt über häufige Fehler.

                Den da meine ich, hatte ich woanders im Thread hier schon verlinkt.

                Aber deine Methode halte ich dennoch für mangelhaft

                Warum?

                und kaum gerechtfertigt in dem Thema und der Kenntnisstufe des betreffenden Perl-Autors.

                Ein exclusive lock auf eine Datei zu acquirieren, die man *ausschließlich* zum Lesen geöffnet hat, ist zwar nicht gefährlich, aber zumindest konzeptionell falsch - und darauf habe ich hingewiesen. Und ein derartiger konzeptioneller Fehler zeugt von mangelndem Verständnis - was darauf hindeutet, dass die Person noch weitere Fehler machen wird, wenn man sie nicht darauf aufmerksam macht, damit sie sich mit diesem Aspekt noch einmal in Ruhe auseinandersetzen kann.

                Es gibt zudem Schreibzugriffe mit Methoden aus Modulen, für die du ein Dummifile brauchst.

                Ich verstehe ehrlich nicht, worauf Du hinauswillst...

                Spätestens hier erachte ich das 'manuelle' individuelle setzen von flock auf einzelne Files für problematisch und es ist eine generelle Lösung mit einem lockfile gefragt.

                Lockfiles haben auch ihre Nachteile. Es hängt IMHO von der Aufgabenstellung und den Rahmenbedingungen ab, was man erreichen will. Wenn es nur darum geht, eine Datei, die man lesen / schreiben will, zu sperren, dann halte ich Lockfiles für konzeptionellen Overkill (denn auch da muss man *einiges* beachten, wenn man es richtig machen will).

                Viele Grüße,
                Christian

                1. Hello,

                  Bittewas? Was hat denn blocking / nonblocking mit shared / exclusive zu tun?

                  Da gibt es doch eine ganz bestimmte Diagramm-Methode, um Race Conditions sichtbar zu machen.
                  Ich komme im Moment leider nicht auf den Namen, ohne zu suchen. Vielleicht weiß es ja jemand auswendig?

                  Ein harzliches Glückauf

                  Tom vom Berg

                  --
                  Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
        2. Morgen Christian,

          Das führt zwar zu keinerlei race conditions, aber warum willst Du ein exclusive lock auf eine Datei, die Du *ausschließlich* zum lesen geöffnet hast? Ein shared lock würde da doch vollkommen ausreichen.

          Das war nur ein herauskopiertes Beispiel. Aber danke für den Hinweis.

          Ich werde mit zwei Dateien arbeiten.
          Als erstes eine CSV-Datei Anlegen (publisher.csv).
          Hier werde ich vier Felder pro Datensatz haben:
              1        2        3          4
          "Layout","Rubrik","Thema.txt","Thema.png"
              |        |          |             |
          "Links","Gesundheit","rauchen.txt","rauchen.png"
          "Rechts","Sparen","auto.txt","auto.png"
          "Oben","Sparen","strom.txt","strom.png"
          "Unten","Lifestyle","urlaub.txt","urlaub.png"

          Diese wird nur gelesen und repräsentiert die Artikel, die dem Client zur Verfügung stehen. (Der Verleger bearbeitet diese Datei manuell, und bestimmt somit, in welcher Rubrik, mit welchem Layout, der Artikel erscheint)

          Dann brauche ich noch eine andere Datei, wahrscheinlich eine reine Textdatei mit dem Namen "integrate.txt". Hier soll (noch Zukunftsmusik) das PerlpScript folgendes machen:

          Öffnen der publisher.csv. Nach den Kriterien (Sparen) Artikel suchen, und entsprechend dem Layout diese Daten mit dem Html-Code in die Datei integrate .txt ablegen. Am Ende die integrated.txt per print in die Webseite aufnehmen. So oder so ähnlich.

          Wobei die if-Abfrage die die csv überprüft, sowie die Zuordnung der CSS-Klassen für den Dateieintrag in die integrate.txt das schwierigste werden dürfte.

          Ach weiss ich noch nicht, ob ich pro Rubrik ein seperates Perlprog schreiben soll, oder ob es eine Möglichkeit gibt, die Rubrikenauswahl vom client in das Perlprog einfliessen zu lassen.

          Soweit nur zur info...

          Grüsse gary

          1. Hi,
            ich glaube, Du solltest Dein Konzept ändern und wirst dann auch gar keine Dateien sperren müssen...

            Als erstes eine CSV-Datei Anlegen (publisher.csv).
            Diese wird nur gelesen und repräsentiert die Artikel, die dem Client zur Verfügung stehen. (Der Verleger bearbeitet diese Datei manuell, und bestimmt somit, in welcher Rubrik, mit welchem Layout, der Artikel erscheint)

            ok, wenn es aber nur *ein* Verleger ist, dann erübrigt sich die Sperrung.

            Öffnen der publisher.csv. Nach den Kriterien (Sparen) Artikel suchen, und entsprechend dem Layout diese Daten mit dem Html-Code in die Datei integrate .txt ablegen. Am Ende die integrated.txt per print in die Webseite aufnehmen. So oder so ähnlich.

            Besser anders:
            Die Datei sollte den reinen Text enthalten, ggfls. mit einem angegebenen HTML-Markup für Überschriften, Hervorhebungen etc.
            Das Layout sollte über CSS erfolgen, welches dem späteren Client anhand der Information in der CSV zusammengestellt wird; am einfachsten wäre die Einbindung verschiedener CSS-Dateien.

            Ich sehe wirklich keinen Grund, verschiedene Textauszeichnungen zu speicherm.

            Wobei die if-Abfrage die die csv überprüft, sowie die Zuordnung der CSS-Klassen für den Dateieintrag in die integrate.txt das schwierigste werden dürfte.

            sehe ich nicht so. Du brauchst doch gar keine verschiedenen CSS-Klassen - bedenke, dass auch Klassen logisch vergeben werden sollten, d.h. (gleiche) Inhalte klassifiziert werden. Gesetzt den Fall, Du willst Namen kennzeichnen und hervorheben, dann bietet sich z.B. <em class="Name"> an - generell!
            Sollte die Hervorhebung nun in einer bestimmten Seite anders als in den übrigen erfolgen (z.B. weil hier eine Namensliste vorliegt), könnte das Script z.B. dem body die ID "Namensliste" geben, für die entsprechend andere CSS-Regeln eingetragen sind.

            freundliche Grüße
            Ingo

            1. Hi Ingo,

              ok, wenn es aber nur *ein* Verleger ist, dann erübrigt sich die Sperrung.

              Hier wird auch nix gesperrt. Die Datei wird manuell hochgeladen (Server) und das Perl Script liest diese immer nur aus (Ähnlich früher Basic read und data). Die Datei wird immer ausgelesen. Beim auslesen werden die Felder geprüft und ggf. in die integrate.txt mit der passenden CSS-Class geschrieben.

              Die Datei sollte den reinen Text enthalten, ggfls. mit einem angegebenen HTML-Markup für Überschriften, Hervorhebungen etc.
              Das Layout sollte über CSS erfolgen, welches dem späteren Client anhand der Information in der CSV zusammengestellt wird; am einfachsten wäre die Einbindung verschiedener CSS-Dateien.

              Ich sehe wirklich keinen Grund, verschiedene Textauszeichnungen zu speicherm.

              Das sind die Klassen, um die es geht (vier verschiedene)http://www.vam-shop.com/online-journal-beta.shtml. Der letzte Artikel ist per SSI eingefügt.

              Das momentane PearlScript:

              #!/usr/bin/perl -w

              ###############################################################################

              DecisionMaker:                   Version 1.00                               #

              Developed started in:            22.05.2008                                 #

              Finished in:                     XX.XX.2008                                 #

              Programmed by:                   Gary-Technologies                          #

              ###############################################################################

              print "Content-type: text/html\n\n";
              print "<!-- ############################### -->\n";
              print "<!-- #Das ist die Klasse Text Links# -->\n";
              print "<!-- ############################### -->\n";
              print "\n";
              print '<div class="inner_left_links">',"\n";
              print '   <p class="report">Ob Sie es glauben oder nicht, dieser Text wurde vom Server generiert. Und das war gar nicht so einfach!</p>',"\n";
              print "</div>\n";
              print "\n";
              print '<div class="inner_right_links">',"\n";
              print '   <img src="bild_05.png" alt="import">',"\n";
              print "</div>\n";

              Dieser untere Teil (Print Anweisungen) zeigt, wie ich mir ungefähr die fertige integrate.txt vorstelle. Die soll aus sochen Blöcken betehen. Also ~ Print "Inhalt von integrate.txt"

              Viele Grüsee Gary

              1. Hi,

                Das sind die Klassen, um die es geht (vier verschiedene)http://www.vam-shop.com/online-journal-beta.shtml. Der letzte Artikel ist per SSI eingefügt.

                Abgesehen davon, dass Du hier eine arge DIV-Wüste generierst, müssen hier tatsächlich unterschiedliche Reihenfolgen gspeichert werden - allerdings nur, wenn Du direkt den HTML-Code für das jeweilige Layout speicherst. Und bei jeder Änderung der Einstellung in der csv müsste auch der Ausgabetext geändert werden. Ich finde das äußerst unflexibel und unpraktisch.

                Du könntest z.B. die Inhalte im XML-Format speichern und dann aus dem XML anhand der Einstellung in der CSV den passenden Code ausgeben. Also z.B.

                <report id="1">  
                  <bild>bild_01.png</bild>  
                  <text>Dieser Text steht links im Browserfenster ...</text>  
                </report>
                

                Oder falls Du das einzubindende Bild in der CSV festlegen willst, könntst Du auf die inneren Elemente ganz verzichten und sogar vorgefertigtes HTML schreiben:
                <p id="report_1">Dieser Text steht links im Browserfenster ...</p>

                freundliche Grüße
                Ingo

                1. Hallo Ingo,

                  [...] müssen hier tatsächlich unterschiedliche Reihenfolgen gspeichert werden - allerdings nur, wenn Du direkt den HTML-Code für das jeweilige Layout speicherst. Und bei jeder Änderung der Einstellung in der csv müsste auch der Ausgabetext geändert werden. Ich finde das äußerst unflexibel und unpraktisch.

                  Sorry, du eisst ja noch nicht alles *g*

                  Der Abfrageteil, soll aus dem rauchen.txt eine Datei einbinden, die so lautet wie der Text rauchen.txt in der csv bzw rauchen.png

                  Also in der integrate.txt:

                  <p class="report">Variable</p>
                  Variable bedeutet den Inhalt der rauchen.txt Das einzufügen wäre die Aufgabe von Perl.

                  <img src="Variable" alt="import">
                  Variable hier bedeutet die Bilddatei rauchen.png

                  Da der Artikel Text sowie das zugehörige Bils den gleichnen Namen haben, wäre auch eine solche CSV möglich:

                  1        2        3
                  "Layout","Rubrik","Thema"
                      |        |          |
                  "Links","Gesundheit","rauchen"
                  "Rechts","Sparen","auto"
                  "Oben","Sparen","strom"
                  "Unten","Lifestyle","urlaub"

                  Und das PerlSkript nimmt "rauchen" als Variable und macht daraus einmal "rauchen.txt" und "rauchen.png", bevor es in die "integrate.txt" schreibt.

                  Du könntest z.B. die Inhalte im XML-Format speichern [...]

                  XML kenne ich nur vom Hörensagen...

                  Grüsse gary

                  1. Hi,

                    Sorry, du eisst ja noch nicht alles *g*

                    so ist es ... aber nach dem, was Du jetzt angibst:

                    Der Abfrageteil, soll aus dem rauchen.txt eine Datei einbinden, die so lautet wie der Text rauchen.txt in der csv bzw rauchen.png

                    Da der Artikel Text sowie das zugehörige Bils den gleichnen Namen haben, wäre auch eine solche CSV möglich:

                    1        2        3
                    "Layout","Rubrik","Thema"
                        |        |          |
                    "Links","Gesundheit","rauchen"
                    "Rechts","Sparen","auto"
                    "Oben","Sparen","strom"
                    "Unten","Lifestyle","urlaub"

                    Und das PerlSkript nimmt "rauchen" als Variable und macht daraus einmal "rauchen.txt" und "rauchen.png", bevor es in die "integrate.txt" schreibt.

                    brauchst Du gar keine "integrate.txt", da ja sämtliche Informationen in der CSV bereits stehen.
                    Du musst diese nur auswerten und die Inhalte dann dynamisch zusammenstellen.
                    Die Reihenfolge würde ich allerdings ändern in "Rubrik","Thema","Layout", da es so etwas einfacher ist, die Einträge zu einer Rubrik rauszufischen.

                    freundliche Grüße
                    Ingo

                    1. Hi Ingo,

                      brauchst Du gar keine "integrate.txt", da ja sämtliche Informationen in der CSV bereits stehen.
                      Du musst diese nur auswerten und die Inhalte dann dynamisch zusammenstellen.

                      Du meinst die Abfrageblöcke können einzelne Print "html code" enthalten?
                      Ich dachte der SSI-Bereich muss am Stück eingebaut werden (deshalb die extra integrated.txt)

                      Die Reihenfolge würde ich allerdings ändern in "Rubrik","Thema","Layout", da es so etwas einfacher ist, die Einträge zu einer Rubrik rauszufischen.

                      Guter Vorschlag. Noch einfacher wäre dann wahrscheinlich so

                      "Rubrik","LayoutA","Thema","LayoutB"

                      also:

                      "Gesundheit","Links1","rauchen","Links2"

                      Dann kann man bei der Abfrage den <Div> Einleitungstag generieren, dannach den Artikel und dannach den </Div> End-Tag.

                      print '<div class="inner_left_links">',"\n";  =Links1
                      print '<p class="report">Variable</p>',"\n";  =rauchen
                      print "</div>\n";                             =Links2

                      Setze mich mal an die CSV-Datei, damit ich mal was habe zum Arbeiten...

                      Viele Grüsse Gary

              2. print "Content-type: text/html\n\n";
                print "<!-- ############################### -->\n";
                print "<!-- #Das ist die Klasse Text Links# -->\n";
                print "<!-- ############################### -->\n";
                print "\n";
                print '<div class="inner_left_links">',"\n";
                print '   <p class="report">Ob Sie es glauben oder nicht, dieser Text wurde vom Server generiert. Und das war gar nicht so einfach!</p>',"\n";
                print "</div>\n";
                print "\n";
                print '<div class="inner_right_links">',"\n";
                print '   <img src="bild_05.png" alt="import">',"\n";
                print "</div>\n";

                abgesehen davon, dass ich dir eher zu der Struktur:

                <div>  
                <img src="..."><p>Text</p>  
                </div>  
                
                

                rate und geraten habe, ist dein ganzer Perl Ansatz auch nicht besonders schön. Anstatt mit SSI zu arbeiten, solltest du komplett ein Skript zum anzeigen nehmen und dann z.b. mit HTML::Template arbeiten. Aber selbst wenn du deinen Ansatz weiterverfolgen willst, bietet sich das CGI Modul an, um das Skript übersichtlicher und weniger fehlerträchtig zu halten. Das ist eine der stärken von Perl, dass es für alles ein Modul beim CPAN gibt und viele Module gehören schon zur Standardinstallation. So wie du es jetzt machst würde ich dir eher zu PHP raten, weil das ist genau für solche Awendungen konzipiert.

                Struppi.

      2. Nummer 4 oder Konstante LOCK_NB bedeutet non-blocking (nur in Verbindung mit 1 oder 2 bzw. LOCK_SH oder LOCK_EX erlaubt und beendet den Zugriffsversuch auf die Datei sofort statt zu warten, bis ein Zugriff möglich ist).

        Öhm, das habe ich auf meinem UNIX noch nicht beachten können.
        Ich verwende LOCK_EX auf ein Dummi-File, und der spätere Prozess wartet. Er bricht nicht ab.

        Was Windows macht, habe ich nicht testen können, weil ich mit mir selber keine Race-Conditions veranstaltet habe.

        Wenn ich die Kombination:

        open(DATENDATEI, "</db/daten.csv");
        flock(DATENDATEI, LOCK_EX);

        habe, und mit der selben nochmals arbeite, beachte ich doch flock, oder nicht?

        flock ist für diesen Zugriff verfügbar, sobald kein anderer Prozess einen Zugriff auf diese Datei hat. Ist der Zugriff erfolgreich, werden andere Zugriffe auf diese Datei durch Prozesse, welche einen flock Antrag stellen, abgelehnt, bis der blockierende Prozess entweder flock auf einen nonblocking Zustand setzt ODER der Zugriff auf das File beendet ist (das File-Handle geschlossen wird).

        mfg Beat

        --
        Selber klauen ist schöner!
        1. Hallo,

          Nummer 4 oder Konstante LOCK_NB bedeutet non-blocking (nur in Verbindung mit 1 oder 2 bzw. LOCK_SH oder LOCK_EX erlaubt und beendet den Zugriffsversuch auf die Datei sofort statt zu warten, bis ein Zugriff möglich ist).

          Öhm, das habe ich auf meinem UNIX noch nicht beachten können.
          Ich verwende LOCK_EX auf ein Dummi-File, und der spätere Prozess wartet. Er bricht nicht ab.

          Folgende Beispielprogramme:

          Shared-Lock auf eine Datei acquirieren:

          #!/usr/bin/env perl  
            
          use warnings;  
          use strict;  
            
          use Fcntl ':flock';  
            
          open DATEI, '<', 'counter.txt';  
          flock DATEI, LOCK_SH;  
          print "Schlafen...\n";  
          sleep (5);  
          close DATEI;
          

          Exklusives Lock auf eine Datei acquirieren, dabei aber LOCK_NB angeben:

          #!/usr/bin/env perl  
            
          use warnings;  
          use strict;  
            
          use Fcntl ':flock';  
            
          open DATEI, '<+', 'counter.txt';  
          if (flock DATEI, LOCK_EX | LOCK_NB) {  
            print "Datei gesperrt!\n";  
          } else {  
            print "Datei nicht gesperrt!\n";  
          }  
          close DATEI;
          

          [Ginge auch umgekehrt mit LOCK_EX und LOCK_SH oder mit zwei Mal LOCK_EX - das ist nur eine Demonstration. Fehlerbehandlung ist auch nicht drin, counter.txt muss man vorher anlegen.]

          Wenn ich in einem Fenster das erste Script laufen lasse und während es pausiert in einem anderen Fenster das zweite Script laufen lasse, dann erhalte ich "Datei nicht gesperrt". Wenn ich nur das zweite Script laufen lasse, erhalte ich "Datei gesperrt". Wenn ich aus dem zweiten Script das OR mit LOCK_NB entferne, wartet das zweite Script auf das Ende des ersten und acquiriert dann das Lock.

          Funktioniert also exakt so, wie in der Doku beschrieben.

          Viele Grüße,
          Christian

          1. Hello,

            Funktioniert also exakt so, wie in der Doku beschrieben.

            Was ich gerne bestätige.

            Und dass man auf einem Windowsrechner, auf dem man der vermeintlich einzige User ist, nicht auch eine Race Condition erzeugen könnte, bestreite ich auch.

            Simpler Anwendungsfall: Ich halte ein File geöffnet, um es zu bearbeiten und nebenbei fällt mir ein, dass ich es doch mal (bevor ich es gelich verunstalte) per Mail meinem Kumpel schicken könnte...

            Ok, dann könnte ich es ja vorher wieder schließen, aber vielleicht habe ich es schon vergessen, dass es in einem der 23 Fenster noch geöffnet ist ;-))

            Ein harzliches Glückauf

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
        2. Hallo Beat!

          Was Windows macht, habe ich nicht testen können, weil ich mit mir selber keine Race-Conditions veranstaltet habe.

          Ich hatte es letztens auch wissen wollen, eine Datei geöffnet, flock (DATEI, 2), großzügiger sleep, dann die Datei versucht mit EditPad Lite zu öffnen. EditPad brachte eine Fehlermeldung, wartete aber nicht:

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --

          _ - jenseits vom delirium - _
          [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          Nichts ist unmöglich? Doch!
          Heute schon gegökt?
  2. Jetzt meine Frage: Was passiert, wenn dieser Fall eintritt. Wartet das zweite Script automatisch bis es zugreifen kann, oder produziert es eine Fehlermeldung im Sinne von :"Sorry - File already open?

    Der Prozess sollte warten.
    Keineswegs kommt es wegen einem nicht Zugriff zu einem Error.

    Beachte, dass flock nur dann wirksam ist, wenn alle beteiligte Prozesse (nicht Clients) den Mechanismus anwenden.
    Das ist wie bei der Ampel. Sie empfiehlt mit rot zu warten, aber verhindert nicht, dass einer nicht weiss, was eine Ampel ist.

    mfg Beat

    --
    Selber klauen ist schöner!
  3. Hallo,

    Jetzt meine Frage: Was passiert, wenn dieser Fall eintritt. Wartet das zweite Script automatisch bis es zugreifen kann, oder produziert es eine Fehlermeldung im Sinne von :"Sorry - File already open?

    Ich habe nicht umsonst einen Artikel geschrieben, der Dateisperren intensiv beleuchtet und mögliche Fallstricke aufzeigt. Besonders relevant für Dich dürtften sein:

    http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/gleichzeitige-zugriffe.htm#arten
    http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/perl.htm

    Allgemein: Sperren sind normalerweise per Default Blockierend, d.h. wenn nicht explizit anders angegeben wartet ein Programm immer bis die Sperre eines anderen Programms frei wird. Allerdings sollte man noch zwischen Mandatory und Advisory Locking unterscheiden, siehe den ersten Link.

    Viele Grüße,
    Christian

      1. Hi,

        http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/perl.htm

        Btw. mir fällt gerade auf, dass da im einen Perl-Beispiel einige < und > nicht korrekt HTML-maskiert sind, da sollte eigentlich <DATEI> statt nichts stehen (im Lese-Beispiel). Ich korrigiere das gleich mal.

        Viele Grüße,
        Christian