locking

Aus RAD Studio
Wechseln zu: Navigation, Suche

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

+