locking
Nach oben zu io.h - Index
Header-Datei
io.h, sys\locking.h
Kategorie
Eingabe-/Ausgaberoutinen
Prototyp
int locking(int handle, int cmd, long length);
Beschreibung
Legt Sperren für die gemeinsame Nutzung von Dateien fest oder setzt diese Sperren zurück.
locking stellt eine Schnittstelle für den Betriebssystemmechanismus zur gemeinsamen Nutzung von Dateien zur Verfügung. Die zu sperrende oder zu entsperrende Datei wird durch handle angegeben und muss geöffnet sein. Der zu sperrende bzw. zu entsperrende Bereich beginnt an der aktuellen Dateiposition und ist length Bytes lang.
In jeder Datei können beliebige, sich nicht überlappende Bereiche mit einer Sperre versehen werden. Programme, die versuchen, Lese- oder Schreiboperationen in einem gesperrten Bereich auszuführen, wiederholen diesen Versuch drei Mal. Wenn alle drei Versuche fehlschlagen, wird die Operation abgebrochen und eine Fehlermeldung ausgegeben.
Mit dem Parameter cmd wird die auszuführende Aktion festgelegt (die Werte sind in sys\locking.h) definiert:
LK_LOCK |
Den Bereich sperren. Wenn der Bereich nicht gesperrt werden konnte, wird 10 Sekunden lang einmal pro Sekunde erneut versucht, die Operation auszuführen, bevor die Operation als gescheitert gilt. |
LK_RLCK |
Entspricht LK_LOCK. |
LK_NBLCK |
Den Bereich sperren. Wenn der Bereich nicht gesperrt werden konnte, gilt die Operation sofort als gescheitert und wird nicht wiederholt. |
LK_NBRLCK |
Same as LK_NBLCK. |
LK_UNLCK |
Sperre des Bereichs aufheben, der zuvor gesperrt worden sein muss. |
Rückgabewert
Bei erfolgreicher Ausführung gibt locking den Wert 0 zurück. Bei einem Fehler gibt die Funktion -1 zurück, und die globale Variable errno wird auf einen der folgenden Werte gesetzt:
EACCES |
File already locked or unlocked (Die Datei ist bereits gesperrt bzw. entsperrt) |
EBADF |
Bad file number (Ungültige Dateinummer) |
EDEADLOCK |
File cannot be locked after 10 retries (cmd is LK_LOCK or LK_RLCK) (Die Datei kann nach 10 wiederholten Versuchen nicht gesperrt werden [cmd hat den Wert LK_LOCK oder LK_RLCK]) |
EINVAL |
Invalid cmd, or SHARE.EXE not loaded (Ungültiger Wert in cmd oder SHARE.EXE nicht geladen) |
Beispiel
#include <io.h>
#include <fcntl.h>
#include <process.h>
#include <share.h>
#include <stdio.h>
#include <sys\locking.h>
int main(void)
{
int handle, status;
long length;
handle = sopen("c:\\autoexec.bat", O_RDONLY,SH_DENYNO);
if (handle < 0) {
printf("sopen failed\n");
exit(1);
}
length = filelength(handle);
status = locking(handle,LK_LOCK,length/2);
if (status == 0)
printf("lock succeeded\n");
else
perror("lock failed");
status = locking(handle,LK_UNLCK,length/2);
if (status == 0)
printf("unlock succeeded\n");
else
perror("unlock failed");
close(handle);
return 0;
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |