Поделиться через


_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

См. также

Обработка файлов
_creat, _wcreat
_open, _wopen