_locking
Блокировка или разблокировка байтов файла.
int _locking(
int fd,
int mode,
long nbytes
);
Параметры
fd
Дескриптор файлаmode
Блокирующее действие.nbytes
Число байтов, предназначенных для блокировки.
Возвращаемое значение
_locking возвращает значение 0 в случае успеха. Возвращаемое значение –1 сообщает о сбое, в соответствии с которым errno установлено в одно из следующих значений.
EACCES
Ошибка блокировки (файл уже блокирован или разблокирован).EBADF
Недопустимый дескриптор файла.EDEADLOCK
Ошибка блокировки. Возврат при определенных флагах _LK_LOCK или _LK_RLCK и файл нельзя блокировать после 10 попыток.EINVAL
Передан недопустимый аргумент для _locking.
Если возникла ошибка из-за неверного параметра, например недопустимого дескриптора файла, вызывается обработчик недопустимого параметра, как описано в разделе Проверка параметров.
Заметки
Функция _locking блокирует или разблокирует nbytes байтов файла, указанного в fd. Блокирование байтов в файле предотвращает доступ к этим байтам другими процессами. Все блокирование или разблокирование начинается с текущей позиции указателя файла и продолжается для следующих nbytes байтов. Возможно блокирование байтов до конца файла.
режим должен быть установлен одной из следующих констант манифестов, которые определены в Locking.h.
_LK_LOCK
Блокирует указанные байты. Если байты не могут быть заблокированы, программа сразу попытается повторить блокировку снова через 1 секунду. Если после 10 попыток байты не могут быть заблокированы, константа возвращает ошибку._LK_NBLCK
Блокирует указанные байты. Если байты не могут быть заблокированы, константа возвращает ошибку._LK_NBRLCK
Эквивалентно _LK_NBLCK._LK_RLCK
Эквивалентно _LK_LOCK._LK_UNLCK
Разблокирует заданные байты, которые должны были ранее быть заблокированы.
Несколько непересекающихся областей файла могут блокироваться. Разблокируемую область, необходимо предварительно блокировать. Функция _locking не осуществляет слияние смежных областей. Если две блокированные области смежны, то каждую область необходимо разблокировать отдельно. Области должны быть блокированы только на короткий промежуток времени и должны быть разблокированы перед закрытием файла или выходом из программы.
Требования
Подпрограмма |
Обязательный заголовок |
Необязательный заголовок |
---|---|---|
_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