sperren von Dateien



  • Hallo,

    ich moechte eine Datei sperren von der mehrere Programme lesen und ein Programm darauf schreibt.
    Hier steht in meinem schlauen Buch, laut POSIX wird "fcntl(int filehandle, int command, struct flock *sperre);" verwendet.

    In einem Beispiel habe ich den Aufruf gesehen.
    Hier lautet es:

    fh = open(name, O_RDWR, 0644);
        if (0<fh) {
            sperre.l_type   = F_WRLCK;
            sperre.l_whence = SEEK_SET;
            sperre.l_start  = 5*sizeof(data);
            sperre.l_len    = sizeof(data);
            x = fcntl(fh, F_SETLKW, &sperre)
    }
    

    Wie ist es aber nun wenn nach der "open" Anweisung die Taskscheibe ein anderes Programm aufruft das lesen will. (Die Sperre ist noch nicht eingeschaltet)

    Was passiert dann ?
    Fragen ueber Fragen 😕

    Danke
    worst_case



  • He Leute,

    das kann doch nicht sein.
    Hat hier keine eine Ahnung oder Idee ??

    Gruss
    worst_case



  • Nabend,

    ich glaube, du verwechselst hier den lock einer Datei unter Windows mit dem unter Linux/Unix.

    Der lock ist _nicht_ dazu da, anderen Programmen das Lesen/Schreiben gaenzlich zu
    verweigern. Dazu solltest du dann die Rechte aendern.

    Der lock ist dazu da, dass andere Prozesse _abfragen_ koennen, ob ein lock existiert und dann
    u. U. warten, bis dieser aufgehoben ist.

    Zu deiner Frage: Wenn der lock noch nicht stattgefunden hat und ein Kontextwechsel
    erfolgt, dann ist auch kein lock auf der Datei vorhanden.

    gruss
    v R



  • Abend,

    das war sehr interessant.

    d.h der lock (Linux) ist nur dazu da um einen anderen Programm zu zeigen, ja die Datei ist gesperrt.

    d.h. wiederum wenn ein lock auf eine Datei gesetzt wird kann ich trotzdem mit der Datei machen was ich will.
    Nur das Abfragen des "Datei-lock's" sagt, kann etwas mit Datei tun oder auch nicht.
    Habe ich das soweit verstanden ??

    Danke
    worst_case



  • Ja, klingt gut.

    Siehe auch man: flock bzw. Wikipedia: File locking in UNIX.

    Von der Manpage ist insbesondere folgender Teil interessant:

    Requesting a lock on an object that is already locked normally causes the
         caller to be blocked until the lock may be acquired.  If LOCK_NB is
         included in operation, then this will not happen; instead the call will
         fail and the error EWOULDBLOCK will be returned.
    


  • Es gibt ja den Unterschied zwischen mandatory und advisory lock.
    beim advisory lock, wird nur ein lock gesetzt, hier kann ein anderes programm immer noch die Datei öffnen/schreiben/lesen...
    beim mandatory lock kommt sobald ein prog versucht die gelockte datei zu öffnen eine fehlermeldung "EAGAIN" bzw. "EACCES".
    als standard einstellung sind unter linux nur advisory locks möglich, wie das umstellen funktioniert, musst du mal recherchieren.

    gruß andi



  • daAndi schrieb:

    Es gibt ja den Unterschied zwischen mandatory und advisory lock.
    beim advisory lock, wird nur ein lock gesetzt, hier kann ein anderes programm immer noch die Datei öffnen/schreiben/lesen...
    beim mandatory lock kommt sobald ein prog versucht die gelockte datei zu öffnen eine fehlermeldung "EAGAIN" bzw. "EACCES".
    als standard einstellung sind unter linux nur advisory locks möglich, wie das umstellen funktioniert, musst du mal recherchieren.

    gruß andi

    Mandatory Lock wird von kaum einem Unix unterstuetzt. Da gibt es z. B. Solaris,
    bei welchem man ein Mandatory Lock erzeugen kann, indem man das Set Group ID Bit
    setzt und das Group Execution Bit loescht. Aber auch das ist keine
    Garantie dafuer, dass ein Mandatory Lock garantiert passiert, denn jeder andere
    Prozess kann, wenn er dazu berechtigt ist, die entsprechenden Bits zuruecksetzen
    und dann hast du wieder nur ein Advisory Lock.

    Unter Linux kann man glaub ich das Dateisystem mit einer entsprechenden Option
    mounten, damit die o. g. Bitmaske auch beachtet wird.

    Hier noch etwas zu dem Thema:

    http://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt

    gruss
    v R


Anmelden zum Antworten