lseek

LSEEK(2)                 Руководство программиста Linux                 LSEEK(2)



ИМЯ
       lseek - изменяет файловое смещение, используемое при чтении/записи

ОБЗОР
       #include <sys/types.h>
       #include <unistd.h>

       off_t lseek(int fd, off_t offset, int whence);

ОПИСАНИЕ
       Функция lseek() изменяет файловое смещение в описании открытого файла,
       связанного с файловым дескрипторов fd, на значение аргумента offset в
       соответствии с директивой whence, которая может принимать одно из
       следующих значений:

       SEEK_SET
              Установить файловое смещение равным offset (в байтах).

       SEEK_CUR
              Установить файловое смещение равным текущему положению плюс offset
              (в байтах).

       SEEK_END
              Установить файловое смещение равным размеру файла плюс offset (в
              байтах).

       Функция lseek() позволяет задавать смещение, которое будет находиться за
       существующим концом файла (но это не изменяет размер файла). Если позднее
       по этому смещению будут записаны данные, то последующее чтение в
       промежутке («дырке») от конца файла до этого смещения, будет возвращать
       нулевые байты ('\0'), пока в этот промежуток действительно не будут
       записаны данные.

   Перемещения по данным файла и промежутки
       Начиная с версии 3.1, в Linux поддерживаются следующие дополнительные
       значения whence:

       SEEK_DATA
              Подогнать файловое смещение к следующему расположению, большему
              или равному значению offset, по которому в файле есть данные. Если
              значение offset указывает на данные, то файловое смещение
              устанавливается в offset.

       SEEK_HOLE
              Подогнать файловое смещение к следующему промежутку, большему или
              равному значению offset. Если значение offset указывает в середину
              промежутка, то файловое смещение устанавливается в offset. Если
              перед offset нет промежутка, то файловое смещение подгоняется к
              концу файла (т.е., это скрытый промежуток, который есть в конце
              любого файла).

       В обоих, показанных выше, случаях, lseek() завершится с ошибкой, если
       offset указывает за конец файла.

       Эти операции позволяют приложениям отображать промежутки в разреженно
       выделенном файле. Это может быть полезно для таких приложений, как
       инструменты резервного копирования файлов, которые могут выиграть в месте
       при создании резервных копий и сохранить промежутки, если у них есть
       механизм их обнаружения.

       Для поддержки этих операций промежуток представляется последовательностью
       нулей, которые (обычно) физически не занимают места на носителе. Однако
       файловая система может не сообщать о промежутках, поэтому эти операции —
       не гарантируемый механизм отображения пространства носителя в файл (более
       того, последовательность нулей, которая на самом деле была записана на
       носитель, может не посчитаться промежутком). В простейшей реализации,
       файловая система может поддержать эти операции так: при SEEK_HOLE всегда
       возвращать смещение конца файла, а при SEEK_DATA всегда возвращать
       значение offset (т.е., даже если расположение, указанное offset, является
       промежутком, это можно считать данными, состоящими из последовательности
       нулей).

       Чтобы получить определения SEEK_DATA и SEEK_HOLE из <unistd.h>, нужно
       задать макрос тестирования свойств _GNU_SOURCE.

       Операции SEEK_HOLE и SEEK_DATA поддерживаются следующими файловыми
       системами:

       *  Btrfs (начиная с Linux 3.1)

       *  OCFS (начиная с Linux 3.2)

       *  XFS (начиная с Linux 3.5)

       *  ext4 (начиная с Linux 3.8)

       *  tmpfs (начиная с Linux 3.8)

       *  NFS (начиная с Linux 3.18)

       *  FUSE (начиная с Linux 4.5)

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
       При успешном выполнении lseek() возвращает получившееся в результате
       смещение в байтах от начала файла. При ошибке возвращается значение
       (off_t) -1 и в errno записывается код ошибки.

ОШИБКИ
       EBADF  fd не является открытым файловым дескриптором.

       EINVAL Неправильное значение whence. Получается, что возвращаемое
              файловое смещение стало бы отрицательным или указывало бы за конец
              поверхности носителя.

       ENXIO  Значение whence равно SEEK_DATA или SEEK_HOLE, а файловое смещение
              указывает за конец файла.

       EOVERFLOW
              Результирующие файловое смещение не может быть представлено типом
              off_t.

       ESPIPE Значение fd связано с каналом, сокетом или FIFO.

СООТВЕТСТВИЕ СТАНДАРТАМ
       POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

       Значения SEEK_DATA и SEEK_HOLE являются нестандартными расширениями,
       которые также есть в Solaris, FreeBSD и DragonFly BSD; их предложили
       включить в следующую редакцию POSIX (выпуск 8).

ЗАМЕЧАНИЯ
       Описание взаимосвязи между файловыми дескрипторами, открытыми файловыми
       описаниями и файлами смотрите в open(2).

       Тип данных off_t представляет собой знаковый целочисленный тип, определён
       в POSIX.1.

       Некоторые устройства не могут выполнять смещения и в POSIX не указано
       какие устройства должны поддерживать lseek().

       В Linux при использовании lseek() на терминальных устройствах
       возвращается ESPIPE.

       При преобразовании старого кода, используйте для значений whence
       следующие макросы:

       старое    новое
       0        SEEK_SET
       1        SEEK_CUR
       2        SEEK_END
       L_SET    SEEK_SET
       L_INCR   SEEK_CUR
       L_XTND   SEEK_END

       Заметим, что файловые дескрипторы, созданные dup(2) или fork(2),
       ссылаются на общей описание открытого файла (и, таким образом, на
       файловое смещение), так что позиционирование в таких файлах может
       приводить к состязательности процессов.

СМОТРИТЕ ТАКЖЕ
       dup(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)



Linux                              2016-03-15                           LSEEK(2)