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 FragenDanke
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