_locking
Блокирует или разблокирует байт файла.
Синтаксис
int _locking(
int fd,
int mode,
long nbytes
);
Параметры
fd
Дескриптор файла.
mode
Выполняемое действие блокировки.
nbytes
Число байтов для блокировки.
Возвращаемое значение
Функция _locking
возвращает 0 в случае успеха. Возвращаемое значение -1 указывает на сбой, в этом случае errno
задано одно из следующих значений.
Значение errno |
Condition |
---|---|
EACCES |
Нарушение блокировки (файл уже заблокирован или разблокирован). |
EBADF |
Недопустимый дескриптор файла. |
EDEADLOCK |
Нарушение блокировки. Возвращается при _LK_LOCK указании или _LK_RLCK флаге, и файл не может быть заблокирован после 10 попыток. |
EINVAL |
В функцию _locking передан недопустимый аргумент. |
Если сбой связан с плохим параметром, например недопустимым дескриптором файла, вызывается обработчик недопустимых параметров, как описано в разделе "Проверка параметров".
Замечания
Функция _locking
блокирует или разблокирует nbytes
байты файла, указанного fd
в файле. Блокировка байтов в файле предотвращает доступ других процессов к этим байтам. Все блокировки или разблокировки начинаются в текущей позиции указателя файла и продолжается для следующих nbytes
байтов. Можно заблокировать байты в прошлом конце файла.
mode
должен быть одной из следующих констант манифеста, определенных в Locking.h.
Значение mode |
Действие |
---|---|
_LK_LOCK |
Блокирует указанные байты. Если байты не могут быть заблокированы, программа немедленно пытается повторить попытку после 1 секунды. Если байты не могут быть заблокированы после 10 попыток, константа возвращает ошибку. |
_LK_NBLCK |
Блокирует указанные байты. Если не удается заблокировать байты, константа возвращает ошибку. |
_LK_NBRLCK |
Эквивалентно _LK_NBLCK . |
_LK_RLCK |
Эквивалентно _LK_LOCK . |
_LK_UNLCK |
Разблокирует указанные байты, которые предварительно должны быть заблокированы. |
Несколько регионов файла, которые не перекрываются, могут быть заблокированы. Разблокируемый раздел файла должен быть предварительно заблокирован. _locking
не объединяет смежные регионы; Если два заблокированных региона находятся рядом, каждый регион должен быть разблокирован отдельно. Разделы следует блокировать только на короткое время. Их необходимо разблокировать перед закрытием файла или выходом из программы.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Требования
Маршрут | Обязательный заголовок | Необязательный заголовок |
---|---|---|
_locking |
<io.h> и <sys/locking.h> | <errno.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
// 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 );
}
Входные данные: crt_locking.txt
The first thirty bytes of this file will be locked.
Пример полученных результатов
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