_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

Эквивалент в .NET Framework

System::IO::FileStream::Lock

См. также

Ссылки

Обработка файла

_create, _wcreat

_open, _wopen