_locking
Blokuje lub odblokuje bajty pliku.
Składnia
int _locking(
int fd,
int mode,
long nbytes
);
Parametry
fd
Deskryptor plików.
mode
Blokowanie akcji do wykonania.
nbytes
Liczba bajtów do zablokowania.
Wartość zwracana
_locking
Zwraca wartość 0, jeśli operacja się powiedzie. Wartość zwracana -1 wskazuje błąd, w którym przypadku errno
ustawiono jedną z następujących wartości.
errno wartość |
Stan |
---|---|
EACCES |
Naruszenie blokady (plik jest już zablokowany lub odblokowany). |
EBADF |
Nieprawidłowy deskryptor plików. |
EDEADLOCK |
Naruszenie blokady. Zwracany po określeniu flagi _LK_LOCK lub _LK_RLCK i nie można zablokować pliku po 10 próbach. |
EINVAL |
Podano nieprawidłowy argument funkcji _locking . |
Jeśli błąd jest spowodowany nieprawidłowym parametrem, takim jak nieprawidłowy deskryptor pliku, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów.
Uwagi
Funkcja _locking
blokuje lub odblokuje nbytes
bajty pliku określonego przez fd
. Blokowanie bajtów w pliku uniemożliwia dostęp do tych bajtów przez inne procesy. Wszystkie blokowanie lub odblokowywanie rozpoczyna się od bieżącej pozycji wskaźnika pliku i przechodzi do następnych nbytes
bajtów. Istnieje możliwość zablokowania bajtów poza końcem pliku.
mode
musi być jedną z następujących stałych manifestu, które są zdefiniowane w pliku Locking.h.
mode wartość |
Efekt |
---|---|
_LK_LOCK |
Blokuje określone bajty. Jeśli nie można zablokować bajtów, program natychmiast spróbuje ponownie po 1 sekundzie. Jeśli bajty nie mogą być zablokowane po 10 próbach, stała zwraca błąd. |
_LK_NBLCK |
Blokuje określone bajty. Jeśli nie można zablokować bajtów, stała zwraca błąd. |
_LK_NBRLCK |
Tak samo jak _LK_NBLCK . |
_LK_RLCK |
Tak samo jak _LK_LOCK . |
_LK_UNLCK |
Odblokowuje określone bajty, które muszą być wcześniej zablokowane. |
Można zablokować wiele regionów pliku, które nie nakładają się na siebie. Odblokowany region musi być wcześniej zablokowany. _locking
nie scala sąsiednich regionów; Jeśli sąsiadują dwa zablokowane regiony, każdy region musi być odblokowany oddzielnie. Regiony powinny być zablokowane tylko na krótko i powinny zostać odblokowane przed zamknięciem pliku lub zamknięciem programu.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek | Opcjonalny nagłówek |
---|---|---|
_locking |
<io.h> i <sys/locking.h> | <errno.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Biblioteki
Wszystkie wersje bibliotek czasu wykonywania języka C.
Przykład
// crt_locking.c
/* This program opens a file with sharing. It locks
* some bytes before reading them, then unlocks them. Note that the
* program works correctly only if the file exists.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/locking.h>
#include <share.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main( void )
{
int fh, numread;
char buffer[40];
/* Quit if can't open file or system doesn't
* support sharing.
*/
errno_t err = _sopen_s( &fh, "crt_locking.txt", _O_RDONLY, _SH_DENYNO,
_S_IREAD | _S_IWRITE );
printf( "%d %d\n", err, fh );
if( err != 0 )
exit( 1 );
/* Lock some bytes and read them. Then unlock. */
if( _locking( fh, LK_NBLCK, 30L ) != -1 )
{
long lseek_ret;
printf( "No one can change these bytes while I'm reading them\n" );
numread = _read( fh, buffer, 30 );
buffer[30] = '\0';
printf( "%d bytes read: %.30s\n", numread, buffer );
lseek_ret = _lseek( fh, 0L, SEEK_SET );
_locking( fh, LK_UNLCK, 30L );
printf( "Now I'm done. Do what you will with them\n" );
}
else
perror( "Locking failed\n" );
_close( fh );
}
Dane wejściowe: crt_locking.txt
The first thirty bytes of this file will be locked.
Przykładowe dane wyjściowe
No one can change these bytes while I'm reading them
30 bytes read: The first thirty bytes of this
Now I'm done. Do what you will with them