Florian Schödel: flock ohne flock()

Hi,

mein webserver unterstützt leider kein flock (oder eben der provider).
Wie kann ich aber trotzdem die entsprechenden dateien schützen? Vielen Dank für eure Antworten.

  1. Hi,

    mein webserver unterstützt leider kein flock (oder eben der provider).
    Wie kann ich aber trotzdem die entsprechenden dateien schützen? Vielen Dank für eure Antworten.

    Eine Möglichkeit:

    $data_dir = $ENV{"DOCUMENT_ROOT"}."....";
    $lockdir = "$data_dir/filelock";

    &FileLock("$lockdir");
    open(...);
    ....
    close(...);
    &FileUnlock("$lockdir");

    File Locking:

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

    Usage    : &FileLock("$lockdir");

    #    : &FileUnlock("$lockdir");                         #
    #                                                             #
    ###############################################################

    sub FileLock   {
      my($i);     # sleep counter
      while (!mkdir($_[0],0777)) {   # if there already is a lock
        sleep 1;     # sleep for 1 sec and try again
        if (++$i>60) { die("File_Lock : Can't create filelock : $!\n"); }
        }
      }

    sub FileUnlock {
      rmdir($_[0]);     # remove file lock dir
      }

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

    1. Hi,

      mein webserver unterstützt leider kein flock (oder eben der provider).
      Wie kann ich aber trotzdem die entsprechenden dateien schützen? Vielen Dank für eure Antworten.

      Eine Möglichkeit:

      $data_dir = $ENV{"DOCUMENT_ROOT"}."....";
      $lockdir = "$data_dir/filelock";

      &FileLock("$lockdir");
      open(...);
      ....
      close(...);
      &FileUnlock("$lockdir");

      File Locking:

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

      Usage    : &FileLock("$lockdir");

      #    : &FileUnlock("$lockdir");                         #
      #                                                             #
      ###############################################################

      sub FileLock   {
        my($i);     # sleep counter
        while (!mkdir($_[0],0777)) {   # if there already is a lock
          sleep 1;     # sleep for 1 sec and try again
          if (++$i>60) { die("File_Lock : Can't create filelock : $!\n"); }
          }
        }

      sub FileUnlock {
        rmdir($_[0]);     # remove file lock dir
        }

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

      danke.

      so was habe ich mir eigentlich schon gedacht. nur 1 sekunde ist schon ein wenig lang. wenn jetzt aber wirklich genau gleichzeitig zwei besucher auf die Seite zugreifen gibt's doch wahrscheinlich auch probleme.

      Kann man nicht irgendwie eine zahl in den arbeitsspeicher des rechners setzen, auf dem der script ausgeführt wird? Oder wie funktioniert eigentlich das flock? ich weiß, für was man das verwendet; aber ich weiß nicht, warum dies z.b. nur unter linux läuft?

      1. danke.

        so was habe ich mir eigentlich schon gedacht. nur 1 sekunde ist schon ein wenig lang. wenn jetzt aber wirklich genau gleichzeitig zwei besucher auf die Seite zugreifen gibt's doch wahrscheinlich auch probleme.

        Kann man nicht irgendwie eine zahl in den arbeitsspeicher des rechners setzen, auf dem der script ausgeführt wird? Oder wie funktioniert eigentlich das flock? ich weiß, für was man das verwendet; aber ich weiß nicht, warum dies z.b. nur unter linux läuft?

        Auszug aus www.cotse.com zur flock()-Funktion:

        flock function
        Lock an entire file with an advisory lock

        flock FILEHANDLE,OPERATION
        Calls flock(2), or an emulation of it, on FILEHANDLE. Returns TRUE for success, FALSE on failure. Produces a fatal error if used on a machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3). flock() is Perl's portable file locking interface, although it locks only entire files, not records.

        On many platforms (including most versions or clones of Unix), locks established by flock() are merely advisory. Such discretionary locks are more flexible, but offer fewer guarantees. This means that files locked with flock() may be modified by programs that do not also use flock(). Windows NT and OS/2 are among the platforms which enforce mandatory locking. See your local documentation for details.

        OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but you can use the symbolic names if import them from the Fcntl module, either individually, or as a group using the ':flock' tag. LOCK_SH requests a shared lock, LOCK_EX requests an exclusive lock, and LOCK_UN releases a previously requested lock. If LOCK_NB is added to LOCK_SH or LOCK_EX then flock() will return immediately rather than blocking waiting for the lock (check the return status to see if you got it).

        To avoid the possibility of mis-coordination, Perl flushes FILEHANDLE before (un)locking it.

        Note that the emulation built with lockf(3) doesn't provide shared locks, and it requires that FILEHANDLE be open with write intent. These are the semantics that lockf(3) implements. Most (all?) systems implement lockf(3) in terms of fcntl(2) locking, though, so the differing semantics shouldn't bite too many people.

        Note also that some versions of flock() cannot lock things over the network; you would need to use the more system-specific fcntl() for that. If you like you can force Perl to ignore your system's flock(2) function, and so provide its own fcntl(2)-based emulation, by passing the switch -Ud_flock to the Configure program when you configure perl.

        1. danke.

          so was habe ich mir eigentlich schon gedacht. nur 1 sekunde ist schon ein wenig lang. wenn jetzt aber wirklich genau gleichzeitig zwei besucher auf die Seite zugreifen gibt's doch wahrscheinlich auch probleme.

          Kann man nicht irgendwie eine zahl in den arbeitsspeicher des rechners setzen, auf dem der script ausgeführt wird? Oder wie funktioniert eigentlich das flock? ich weiß, für was man das verwendet; aber ich weiß nicht, warum dies z.b. nur unter linux läuft?

          Auszug aus www.cotse.com zur flock()-Funktion:

          flock function
          Lock an entire file with an advisory lock

          flock FILEHANDLE,OPERATION
          Calls flock(2), or an emulation of it, on FILEHANDLE. Returns TRUE for success, FALSE on failure. Produces a fatal error if used on a machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3). flock() is Perl's portable file locking interface, although it locks only entire files, not records.

          On many platforms (including most versions or clones of Unix), locks established by flock() are merely advisory. Such discretionary locks are more flexible, but offer fewer guarantees. This means that files locked with flock() may be modified by programs that do not also use flock(). Windows NT and OS/2 are among the platforms which enforce mandatory locking. See your local documentation for details.

          OPERATION is one of LOCK_SH, LOCK_EX, or LOCK_UN, possibly combined with LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but you can use the symbolic names if import them from the Fcntl module, either individually, or as a group using the ':flock' tag. LOCK_SH requests a shared lock, LOCK_EX requests an exclusive lock, and LOCK_UN releases a previously requested lock. If LOCK_NB is added to LOCK_SH or LOCK_EX then flock() will return immediately rather than blocking waiting for the lock (check the return status to see if you got it).

          To avoid the possibility of mis-coordination, Perl flushes FILEHANDLE before (un)locking it.

          Note that the emulation built with lockf(3) doesn't provide shared locks, and it requires that FILEHANDLE be open with write intent. These are the semantics that lockf(3) implements. Most (all?) systems implement lockf(3) in terms of fcntl(2) locking, though, so the differing semantics shouldn't bite too many people.

          Note also that some versions of flock() cannot lock things over the network; you would need to use the more system-specific fcntl() for that. If you like you can force Perl to ignore your system's flock(2) function, and so provide its own fcntl(2)-based emulation, by passing the switch -Ud_flock to the Configure program when you configure perl.