Loading ...
Sorry, an error occurred while loading the content.

read/write/flock question

Expand Messages
  • Luinrandir Hernsen
    I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
    Message 1 of 10 , Dec 3, 2004
    • 0 Attachment
      I had this thought... (ok.. duct tape your collective heads, perl addicts!)
      i know this is not the correct way, but I was wondering if there was a way
      a open file command could be told to wait untill the flock was clear to allow
      the next person into the file??? I thought is using an on error type of command
      but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
      so it doesn't become an infinite loop. Again I know this is not perl code..
      I am seeking the logic on how this is done and suggestions on the code.

      $TimeEnd = $TimeNow+5;
      While (@Data eq "" || TimeNow > TimeEnd)
      {
      open file;
      flock;
      read @Data;
      process @Data;
      print @Data;
      close file;
      }

      I also need the write to file version of this.

      perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
      and am only begining to learn about strings like $_[0] and those other "secret" strings.
      I already know I really SUCK as this.... so try not to comment to that point.

      Thanks for any help you can offer.
      Lou

      [Non-text portions of this message have been removed]
    • Luinrandir Hernsen
      I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
      Message 2 of 10 , Dec 3, 2004
      • 0 Attachment
        I had this thought... (ok.. duct tape your collective heads, perl addicts!)
        i know this is not the correct way, but I was wondering if there was a way
        a open file command could be told to wait untill the flock was clear to allow
        the next person into the file??? I thought is using an on error type of command
        but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
        so it doesn't become an infinite loop. Again I know this is not perl code..
        I am seeking the logic on how this is done and suggestions on the code.

        $TimeEnd = $TimeNow+5;
        While (@Data eq "" || TimeNow > TimeEnd)
        {
        open file;
        flock;
        read @Data;
        process @Data;
        print @Data;
        close file;
        }

        I also need the write to file version of this.

        perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
        and am only begining to learn about strings like $_[0] and those other "secret" strings.
        I already know I really SUCK as this.... so try not to comment to that point.

        Thanks for any help you can offer.
        Lou

        [Non-text portions of this message have been removed]
      • Luinrandir Hernsen
        I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
        Message 3 of 10 , Dec 3, 2004
        • 0 Attachment
          I had this thought... (ok.. duct tape your collective heads, perl addicts!)
          i know this is not the correct way, but I was wondering if there was a way
          a open file command could be told to wait untill the flock was clear to allow
          the next person into the file??? I thought is using an on error type of command
          but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
          so it doesn't become an infinite loop. Again I know this is not perl code..
          I am seeking the logic on how this is done and suggestions on the code.

          $TimeEnd = $TimeNow+5;
          While (@Data eq "" || TimeNow > TimeEnd)
          {
          open file;
          flock;
          read @Data;
          process @Data;
          print @Data;
          close file;
          }

          I also need the write to file version of this.

          perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
          and am only begining to learn about strings like $_[0] and those other "secret" strings.
          I already know I really SUCK as this.... so try not to comment to that point.

          Thanks for any help you can offer.
          Lou

          [Non-text portions of this message have been removed]
        • Luinrandir Hernsen
          I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
          Message 4 of 10 , Dec 3, 2004
          • 0 Attachment
            I had this thought... (ok.. duct tape your collective heads, perl addicts!)
            i know this is not the correct way, but I was wondering if there was a way
            a open file command could be told to wait untill the flock was clear to allow
            the next person into the file??? I thought is using an on error type of command
            but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
            so it doesn't become an infinite loop. Again I know this is not perl code..
            I am seeking the logic on how this is done and suggestions on the code.

            $TimeEnd = $TimeNow+5;
            While (@Data eq "" || TimeNow > TimeEnd)
            {
            open file;
            flock;
            read @Data;
            process @Data;
            print @Data;
            close file;
            }

            I also need the write to file version of this.

            perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
            and am only begining to learn about strings like $_[0] and those other "secret" strings.
            I already know I really SUCK as this.... so try not to comment to that point.

            Thanks for any help you can offer.
            Lou

            [Non-text portions of this message have been removed]
          • Luinrandir Hernsen
            I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
            Message 5 of 10 , Dec 3, 2004
            • 0 Attachment
              I had this thought... (ok.. duct tape your collective heads, perl addicts!)
              i know this is not the correct way, but I was wondering if there was a way
              a open file command could be told to wait untill the flock was clear to allow
              the next person into the file??? I thought is using an on error type of command
              but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
              so it doesn't become an infinite loop. Again I know this is not perl code..
              I am seeking the logic on how this is done and suggestions on the code.

              $TimeEnd = $TimeNow+5;
              While (@Data eq "" || TimeNow > TimeEnd)
              {
              open file;
              flock;
              read @Data;
              process @Data;
              print @Data;
              close file;
              }

              I also need the write to file version of this.

              perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
              and am only begining to learn about strings like $_[0] and those other "secret" strings.
              I already know I really SUCK as this.... so try not to comment to that point.

              Thanks for any help you can offer.
              Lou

              [Non-text portions of this message have been removed]
            • Luinrandir Hernsen
              I had this thought... (ok.. duct tape your collective heads, perl addicts!) i know this is not the correct way, but I was wondering if there was a way a open
              Message 6 of 10 , Dec 3, 2004
              • 0 Attachment
                I had this thought... (ok.. duct tape your collective heads, perl addicts!)
                i know this is not the correct way, but I was wondering if there was a way
                a open file command could be told to wait untill the flock was clear to allow
                the next person into the file??? I thought is using an on error type of command
                but i'm not sure how to loop it.. I would also need to put a 5 sec timeout too,
                so it doesn't become an infinite loop. Again I know this is not perl code..
                I am seeking the logic on how this is done and suggestions on the code.

                $TimeEnd = $TimeNow+5;
                While (@Data eq "" || TimeNow > TimeEnd)
                {
                open file;
                flock;
                read @Data;
                process @Data;
                print @Data;
                close file;
                }

                I also need the write to file version of this.

                perl disclaimer-I'm a beginner.. a perl-challenged person. I don't know CGI
                and am only begining to learn about strings like $_[0] and those other "secret" strings.
                I already know I really SUCK as this.... so try not to comment to that point.

                Thanks for any help you can offer.
                Lou

                [Non-text portions of this message have been removed]
              • Charles K. Clarkson
                ... Read perlopentut File Locking . ... Can you rephrase that? It doesn t make sense to me. HTH, Charles K. Clarkson -- Mobile Homes Specialist 254 968-8328
                Message 7 of 10 , Dec 4, 2004
                • 0 Attachment
                  Luinrandir Hernsen <Luinrandir@...> wrote:

                  : I had this thought... (ok.. duct tape your collective heads,
                  : perl addicts!) i know this is not the correct way, but I was
                  : wondering if there was a way a open file command could be told
                  : to wait untill the flock was clear to allow the next person
                  : into the file??? I thought is using an on error type of command
                  : but i'm not sure how to loop it.. I would also need to put a 5
                  : sec timeout too, so it doesn't become an infinite loop. Again I
                  : know this is not perl code.. I am seeking the logic on how this
                  : is done and suggestions on the code.

                  Read perlopentut 'File Locking'.


                  : I also need the write to file version of this.

                  Can you rephrase that? It doesn't make sense to me.

                  HTH,

                  Charles K. Clarkson
                  --
                  Mobile Homes Specialist
                  254 968-8328
                • Luinrandir Hernsen
                  ... where? this makes no sence to me.... Lou
                  Message 8 of 10 , Dec 4, 2004
                  • 0 Attachment
                    >
                    > Read perlopentut 'File Locking'.
                    >

                    where? this makes no sence to me....

                    Lou
                  • Charles K. Clarkson
                    ... The perl documentation comes with in a bunch of files. One of those files is named perlopentut . In that file is a section named File Locking . In that
                    Message 9 of 10 , Dec 4, 2004
                    • 0 Attachment
                      Luinrandir Hernsen <Luinrandir@...> wrote:

                      : : Read perlopentut 'File Locking'.
                      : :
                      :
                      : where? this makes no sence to me....

                      The perl documentation comes with in a bunch of files.
                      One of those files is named "perlopentut". In that file is
                      a section named 'File Locking'. In that section is a few
                      examples of how to use flock() and why.

                      I installed Activeperl on my system (windows XP). I
                      installed it on my C: drive in a directory named Perl.
                      In my browser, if I go to this address "perlopentut" is
                      available there as an HTML file.

                      file:///C:/Perl/html/index.html

                      The same documentation is available online as HTML
                      files at http://www.perldoc.com/.


                      HTH,

                      Charles K. Clarkson
                      --
                      Mobile Homes Specialist
                      254 968-8328
                    • Luinrandir Hernsen
                      ok... i found this..... and now i am more confused...... nothing like knowing how much i don t know! File Locking In a multitasking environment, you may need
                      Message 10 of 10 , Dec 4, 2004
                      • 0 Attachment
                        ok... i found this.....
                        and now i am more confused......
                        nothing like knowing how much i don't know!


                        File Locking

                        In a multitasking environment, you may need to be careful not to col-
                        lide with other processes who want to do I/O on the same files as you
                        are working on. You'll often need shared or exclusive locks on files
                        for reading and writing respectively. You might just pretend that
                        only
                        exclusive locks exist.

                        Never use the existence of a file "-e $file" as a locking indication,
                        because there is a race condition between the test for the existence
                        of
                        the file and its creation. It's possible for another process to
                        create
                        a file in the slice of time between your existence check and your
                        attempt to create the file. Atomicity is critical.

                        Perl's most portable locking interface is via the "flock" function,
                        whose simplicity is emulated on systems that don't directly support
                        it
                        such as SysV or Windows. The underlying semantics may affect how it
                        all works, so you should learn how "flock" is implemented on your
                        sys-
                        tem's port of Perl.

                        File locking does not lock out another process that would like to do
                        I/O. A file lock only locks out others trying to get a lock, not
                        pro-
                        cesses trying to do I/O. Because locks are advisory, if one process
                        uses locking and another doesn't, all bets are off.

                        By default, the "flock" call will block until a lock is granted. A
                        request for a shared lock will be granted as soon as there is no
                        exclu-
                        sive locker. A request for an exclusive lock will be granted as soon
                        as there is no locker of any kind. Locks are on file descriptors,
                        not
                        file names. You can't lock a file until you open it, and you can't
                        hold on to a lock once the file has been closed.

                        Here's how to get a blocking shared lock on a file, typically used
                        for
                        reading:

                        use 5.004;
                        use Fcntl qw(:DEFAULT :flock);
                        open(FH, "< filename") or die "can't open filename: $!";
                        flock(FH, LOCK_SH) or die "can't lock filename: $!";
                        # now read from FH

                        You can get a non-blocking lock by using "LOCK_NB".

                        flock(FH, LOCK_SH | LOCK_NB)
                        or die "can't lock filename: $!";

                        This can be useful for producing more user-friendly behaviour by
                        warn-
                        ing if you're going to be blocking:

                        use 5.004;
                        use Fcntl qw(:DEFAULT :flock);
                        open(FH, "< filename") or die "can't open filename: $!";
                        unless (flock(FH, LOCK_SH | LOCK_NB)) {
                        $| = 1;
                        print "Waiting for lock...";
                        flock(FH, LOCK_SH) or die "can't lock filename: $!";
                        print "got it.\n"
                        }
                        # now read from FH

                        To get an exclusive lock, typically used for writing, you have to be
                        careful. We "sysopen" the file so it can be locked before it gets
                        emp-
                        tied. You can get a nonblocking version using "LOCK_EX | LOCK_NB".

                        use 5.004;
                        use Fcntl qw(:DEFAULT :flock);
                        sysopen(FH, "filename", O_WRONLY | O_CREAT)
                        or die "can't open filename: $!";
                        flock(FH, LOCK_EX)
                        or die "can't lock filename: $!";
                        truncate(FH, 0)
                        or die "can't truncate filename: $!";
                        # now write to FH

                        Finally, due to the uncounted millions who cannot be dissuaded from
                        wasting cycles on useless vanity devices called hit counters, here's
                        how to increment a number in a file safely:

                        use Fcntl qw(:DEFAULT :flock);

                        sysopen(FH, "numfile", O_RDWR | O_CREAT)
                        or die "can't open numfile: $!";
                        # autoflush FH
                        $ofh = select(FH); $| = 1; select ($ofh);
                        flock(FH, LOCK_EX)
                        or die "can't write-lock numfile: $!";

                        $num = <FH> || 0;
                        seek(FH, 0, 0)
                        or die "can't rewind numfile : $!";
                        print FH $num+1, "\n"
                        or die "can't write numfile: $!";

                        truncate(FH, tell(FH))
                        or die "can't truncate numfile: $!";
                        close(FH)
                        or die "can't close numfile: $!";
                      Your message has been successfully submitted and would be delivered to recipients shortly.