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, которая может принимать одно из следующих значений:
Вызов lseek() позволяет задавать смещение, которое будет находиться за существующим концом файла (но это не изменяет размер файла). Если позднее по этому смещению будут записаны данные, то последующее чтение в промежутке («дырке») от конца файла до этого смещения, будет возвращать нулевые байты ('\0'), пока в этот промежуток действительно не будут записаны данные.
Начиная с версии 3.1, в Linux поддерживаются следующие дополнительные значения whence:
В обоих, показанных выше, случаях, lseek() завершится с ошибкой, если offset указывает за конец файла.
Эти операции позволяют приложениям отображать промежутки в разреженно выделенном файле. Это может быть полезно для таких приложений, как инструменты резервного копирования файлов, которые могут выиграть в месте при создании резервных копий и сохранить промежутки, если у них есть механизм их обнаружения.
Для поддержки этих операций промежуток представляется последовательностью нулей, которые (обычно) физически не занимают места на носителе. Однако файловая система может не сообщать о промежутках, поэтому эти операции — не гарантируемый механизм отображения пространства носителя в файл (более того, последовательность нулей, которая на самом деле была записана на носитель, может не посчитаться промежутком). В простейшей реализации, файловая система может поддержать эти операции так: при SEEK_HOLE всегда возвращать смещение конца файла, а при SEEK_DATA всегда возвращать значение offset (т.е., даже если расположение, указанное offset, является промежутком, это можно считать данными, состоящими из последовательности нулей).
Чтобы получить определения SEEK_DATA и SEEK_HOLE из <unistd.h>, нужно задать макрос тестирования свойств _GNU_SOURCE.
Операции SEEK_HOLE и SEEK_DATA поддерживаются следующими файловыми системами:
При успешном выполнении lseek() возвращает получившееся в результате смещение в байтах от начала файла. При ошибке возвращается значение (off_t) -1 и в errno записывается код ошибки.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
Значения SEEK_DATA и SEEK_HOLE являются нестандартными расширениями, которые также есть в Solaris, FreeBSD и DragonFly BSD; их предложили включить в следующую редакцию POSIX (выпуск 8).
Описание взаимосвязи между файловыми дескрипторами, открытыми файловыми описаниями и файлами смотрите в open(2).
Если установлен флаг состояние файла O_APPEND в открытом файловом описании, то write(2) всегда перемещает файловое смещение в конец файла, независимо от использования lseek().
Тип данных off_t представляет собой знаковый целочисленный тип, определён в POSIX.1.
Некоторые устройства не могут выполнять смещения и в POSIX не указано какие устройства должны поддерживать lseek().
В Linux при использовании lseek() на устройствах терминалов возвращается ошибка ESPIPE.
dup(2), fallocate(2), fork(2), open(2), fseek(3), lseek64(3), posix_fallocate(3)
2019-03-06 | Linux |