Alain: an die perlspezies -> Frage!

Hallo,
ich möchte mal die perl spezialisten re datei-öffnen fragen,warum man das so macht,weil schon oft gesehen:
prinzip ist bekanntlich so:
man öffnet eine datei->einlesen
flockt
schliesst
es passiert was
datei wird wird wieder zum schreiben geöffnet
flockt
schreibt...
schliesst.endof...

meine frage jetzt,warum kann man nicht einfach so:
datei öffnen zum lesen und schreiben
flockt LOCK_EX
es passiert was
#kein LOCK_UN
schliesst die datei -> fertig

machen?
wär doch viel einfacher und weniger speicher fressend?!
warum ist das nicht üblich so?
Grüsse
Alain

  1. Hi,

    Subject: (PERL) an die perlspezies -> Frage!

    Dein gewähltes Subject verdient einen Preis für die sinnfreieste Formulierung der Woche. Bitte bemühe Dich in Zukunft um eine Formulierung, die auf das Thema des Postings schließen lässt.

    wär doch viel einfacher und weniger speicher fressend?!

    Serverseitig können dutzende Prozesse gleichzeitig das (annähernd) gleiche machen wollen. Wenn diese alle gegenseitig aufeinander warten müssen, weil irgend ein Prozess eine Datei millisekundenlang blockiert, werden es schnell hunderte - also mehr als zur Verfügung stehen.

    warum ist das nicht üblich so?

    Weil man sich um atomare Aktionen bemüht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Subject: (PERL) an die perlspezies -> Frage!

      Dein gewähltes Subject verdient einen Preis für die sinnfreieste Formulierung der Woche. Bitte bemühe Dich in Zukunft um eine Formulierung, die auf das Thema des Postings schließen lässt.

      -> registriert -> :)
      Gruss
      Alain

  2. Den wichtigste Punkt hast du vergessen. Wir sprechen von einem CGI Programm, oder?

    Du musst dir überlegen, es sit durchaus möglich, das hunderte Benutzer gleichzeitig auf das Skript zugreifen. hundertmal passiert das was du beschreibst gleichzeitig. Kannst du dir das Vorstellen?

    prinzip ist bekanntlich so:

    Und das ist gefährlich, denn ....

    man öffnet eine datei->einlesen
    flockt
    schliesst
    es passiert was

    und hier kann ein anderer Prozeß die Datei öffnen und einlesen.

    datei wird wird wieder zum schreiben geöffnet
    flockt
    schreibt...
    schliesst.endof...

    und jetzt kommt der 2. Prozess und macht das gleiche und in dem Moment sind die Änderungen wieder weg.

    meine frage jetzt,warum kann man nicht einfach so:
    datei öffnen zum lesen und schreiben
    flockt LOCK_EX
    es passiert was
    #kein LOCK_UN
    schliesst die datei -> fertig
    machen?

    So sollte man es tun, dass habe ich dir auch schon mehrmals gesagt.

    wär doch viel einfacher und weniger speicher fressend?!

    Das ist egal, es ist nämlich nicht einfacher, da du beim lesen und schreiben immer darauf achten musst wo der Dateizeiger steht und wenn du Daten löschen willst musst du erst den Inhalt löschen bevor du die Datei neu beschreibst, da du ansonsten Datenmüll in deiner Datei hast.

    warum ist das nicht üblich so?

    Weil du bei CGI Programmen nie weißt was passiert.

    Struppi.

    1. hi,

      Den wichtigste Punkt hast du vergessen. Wir sprechen von einem CGI Programm, oder?

      naja,wieso nicht auch perl?

      Du musst dir überlegen, es sit durchaus möglich, das hunderte Benutzer gleichzeitig auf das Skript zugreifen. hundertmal passiert das was du beschreibst gleichzeitig. Kannst du dir das Vorstellen?

      prinzip ist bekanntlich so:

      Und das ist gefährlich, denn ....

      ich weiss,aber wieso kriegt man erst den falschen hinweis was falsch zu machen bevor,man auf die idee kommt,es richtig zu erklären(z.B. in selfhtml),damit man erst gar nicht falsch macht bzw. schlecht programiert?

      man öffnet eine datei->einlesen
      flockt
      schliesst
      es passiert was

      und hier kann ein anderer Prozeß die Datei öffnen und einlesen.

      weiss ich inzwischen auch :)

      datei wird wird wieder zum schreiben geöffnet
      flockt
      schreibt...
      schliesst.endof...

      und jetzt kommt der 2. Prozess und macht das gleiche und in dem Moment sind die Änderungen wieder weg.

      eben.

      meine frage jetzt,warum kann man nicht einfach so:
      datei öffnen zum lesen und schreiben
      flockt LOCK_EX
      es passiert was
      #kein LOCK_UN
      schliesst die datei -> fertig
      machen?

      So sollte man es tun, dass habe ich dir auch schon mehrmals gesagt.

      ok.

      wär doch viel einfacher und weniger speicher fressend?!

      Das ist egal, es ist nämlich nicht einfacher, da du beim lesen und schreiben immer darauf achten musst wo der Dateizeiger steht und wenn du Daten löschen willst musst du erst den Inhalt löschen bevor du die Datei neu beschreibst, da du ansonsten Datenmüll in deiner Datei hast.

      open(DATEI, "+>/tmp/server.cfg");#löscht den bisherigen inhalt der datei und kann auch lesen?Das ist doch auch für die katz,wenn man den inhalt erst löscht,kann man es auch nicht einlesen?!(in selhtml so beschrieben)

      dann wäre dies
      open(DATEI, "+</tmp/server.cfg");# doch besser ?

      warum ist das nicht üblich so?

      Weil du bei CGI Programmen nie weißt was passiert.

      wieso muss man das ?     ->         ^

      Gruss
      Alain

      1. Den wichtigste Punkt hast du vergessen. Wir sprechen von einem CGI Programm, oder?

        naja,wieso nicht auch perl?

        Das hat nichts miteinenader zu tun. Du sprichst von einem Perlskript, das als CGI augerufen wird und für deine Frage ist das CGI wichtiger als das es ein Perl Skript  ist (das gleiche Problem haben alle CGI Programme in allen Sprachen auch)

        Du musst dir überlegen, es sit durchaus möglich, das hunderte Benutzer gleichzeitig auf das Skript zugreifen. hundertmal passiert das was du beschreibst gleichzeitig. Kannst du dir das Vorstellen?

        prinzip ist bekanntlich so:

        Und das ist gefährlich, denn ....

        ich weiss,aber wieso kriegt man erst den falschen hinweis was falsch zu machen bevor,man auf die idee kommt,es richtig zu erklären(z.B. in selfhtml),damit man erst gar nicht falsch macht bzw. schlecht programiert?

        Was heißt falschen Hinweis?
        Du kriegst in selfhtml gezeigt wie du Perl programmierst. Das du aber für deine spezielle Anforderung (hier: ein CGI Programm) auch spezielle Lösung brauchst ist ertsmal kein Punkt der in einem Grundlagen Tutorial finden musst.

        D.h. du musst dich nach, für dein spezifisches Problem betrefenden, Tutorials umschauen.

        dann wäre dies
        open(DATEI, "+</tmp/server.cfg");# doch besser ?

        warum ist das nicht üblich so?

        Weil es wesentlich kompizierter ist.

        1. öffnen der Datei
        2. flocken der Datei
        3. setzen des Filezeigers
        5. einlesen der Datei
        6. ändern der daten
        7. setzen des filezeigers
        8. löschen des Inhalts
        7. setzen des filezeigers
        9. schreiben des Inhaltes

        Struppi.

        1. hi,

          Was heißt falschen Hinweis?

          nö,sorry er war nicht falsch,aber man sollte auf die möglichen probleme hinweisen,wenn man es so macht wie üblich(öffnen,einlesen,schliessen,zum schreiben wieder öffnen schreiben,schliessen).

          Du kriegst in selfhtml gezeigt wie du Perl programmierst. Das du aber für deine spezielle Anforderung (hier: ein CGI Programm) auch spezielle Lösung brauchst ist ertsmal kein Punkt der in einem Grundlagen Tutorial finden musst.

          ich denke nicht dass das so eine spezielle anforderung von mir ist,weil wie Du ja selbst sagtest,haben auch andere programm stile damit (lock) ein problem.

          dann wäre dies
          open(DATEI, "+</tmp/server.cfg");# doch besser ?

          warum ist das nicht üblich so?

          Weil es wesentlich kompizierter ist.

          1. öffnen der Datei
          2. flocken der Datei
          3. setzen des Filezeigers
          4. einlesen der Datei
          5. ändern der daten
          6. setzen des filezeigers
          7. löschen des Inhalts
          8. setzen des filezeigers
          9. schreiben des Inhaltes

          wie ist der vorgang,mit open (+>$datei ....) ?
          Gruss
          Alain

          1. Weil es wesentlich kompizierter ist.

            1. öffnen der Datei
            2. flocken der Datei
            3. setzen des Filezeigers
            4. einlesen der Datei
            5. ändern der daten
            6. setzen des filezeigers
            7. löschen des Inhalts
            8. setzen des filezeigers
            9. schreiben des Inhaltes

            wie ist der vorgang,mit open (+>$datei ....) ?

            fast genauso wie oben geschildert, dukannst dir aber 3, 5, 6 und 7 (wo ist denn die 4?)  sparen. Und letzltich macht >+ auch gar keinen Sinn in deinem Falle da die Datei ja gelöscht wird. Diese Option ist nur sinnvoll bei Skripten die über einen längeren Zeitraum laufen.

            Struppi.

            1. hi,

              1. öffnen der Datei
              2. flocken der Datei
              3. setzen des Filezeigers
              4. einlesen der Datei
              5. ändern der daten
              6. setzen des filezeigers
              7. löschen des Inhalts
              8. setzen des filezeigers
              9. schreiben des Inhaltes

              wie ist der vorgang,mit open (+>$datei ....) ?

              fast genauso wie oben geschildert, dukannst dir aber 3, 5, 6 und 7 (wo ist denn die 4?)  sparen.

              seh ich auch grade :)

              Und letzltich macht >+ auch gar keinen Sinn in deinem Falle da die Datei ja gelöscht wird.

              meinst Du nicht +> ?
              oder ist da wieder was,was ich nicht weiss?bzw.,falls es das gibt(>+ und +>)wo ist da der unterschied?

              Gruss
              Alain

              1. Und letzltich macht >+ auch gar keinen Sinn in deinem Falle da die Datei ja gelöscht wird.

                meinst Du nicht +> ?
                oder ist da wieder was,was ich nicht weiss?bzw.,falls es das gibt(>+ und +>)wo ist da der unterschied?

                Ja, ich mein >+

                aber das hat nichts mit FLOCK zu tun.

                Struppi.

                1. hi,

                  gibt(>+ und +>)wo ist da der unterschied?

                  Ja, ich mein >+

                  aber das hat nichts mit FLOCK zu tun.

                  ja das weiss ich ;-)
                  komisch aber in selhtml stehts +> so.
                  Was ist den nun aufwendiger fürs system,wenn es wie üblich gemacht wird
                  (<öffnen lesen  -> lock machwas schliessen wieder >öffnen lock -> schreiben machwas schliessen)
                  oder wenn es so
                  (+> bzw. +<öffnen lesen und schreiben -> lock machwas schliessen)
                  gemacht wird?Und würde das den selbigen effekt nach sich ziehen?
                  Alain

                  1. komisch aber in selhtml stehts +> so.

                    Oh, Mann. Ja du hast recht, ich bin ein Idiot ;-)

                    Was ist den nun aufwendiger fürs system,wenn es wie üblich gemacht wird
                    (<öffnen lesen  -> lock machwas schliessen wieder >öffnen lock -> schreiben machwas schliessen)
                    oder wenn es so
                    (+> bzw. +<öffnen lesen und schreiben -> lock machwas schliessen)

                    öffnen, lock und dann erst lesen und schreiben.

                    gemacht wird?Und würde das den selbigen effekt nach sich ziehen?

                    Das spielt keine Rolle (ich weiß es nicht) bei CGI Programmen musst du es so machen. Ansonsten droht Datenverlust.

                    Struppi.

                    1. hi,

                      öffnen, lock und dann erst lesen und schreiben.

                      ok

                      gemacht wird?Und würde das den selbigen effekt nach sich ziehen?

                      Das spielt keine Rolle (ich weiß es nicht) bei CGI Programmen musst du es so machen. Ansonsten droht Datenverlust.

                      habs jetzt mal so versucht mit meinem shopping perl script,
                      nur dort wo mit öffnen-flock-LOCK_SH-lesen-schliessen->öffnen-flock-LOCK_EX-schreiben->schliessen geschrieben war->
                      also mit direkt lesen und schreiben -+>öffnen->flock-LOCK_EX lesen->schreiben...schliessen.
                      geht so aber nicht,habs jetzt wieder zurückgestellt :(
                      Egal es geht ja so,wie es jetzt ist.
                      Grüsse
                      Alain

                      1. habs jetzt mal so versucht mit meinem shopping perl script,
                        nur dort wo mit öffnen-flock-LOCK_SH-lesen-schliessen->öffnen-flock-LOCK_EX-schreiben->schliessen geschrieben war->
                        also mit direkt lesen und schreiben -+>öffnen->flock-LOCK_EX lesen->schreiben...schliessen.
                        geht so aber nicht,habs jetzt wieder zurückgestellt :(

                        Tja, gehen tut es natürlich, es ist aber iwe ich schon gesagt hatte komplizierter weil du die Position im File auch immer richtig setzen musst.

                        Egal es geht ja so,wie es jetzt ist.

                        Du meinst das es bis jetzt funktioniert, wie gesagt früher oder später sind wirst du Datenverlust erleiden. Wobei das im Konrekten fall vielleicht sogar vernachlässigbar ist, da vermutlich immer nur einer an einer Datei arbeitet. Trotz allem solltest du versuchen es mit einem richtigen Version hinzukriegen, denn das ist eine der grundlagen der CGI Programmierung.

                        Struppi.