Читаем Linux API. Исчерпывающее руководство полностью

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

Возвращает новое файловое смещение при успешном завершении или –1 при ошибке

Аргумент offset определяет значение смещения в байтах. (Тип данных off_t — целочисленный тип со знаком, определенный в SUSv3.) Аргшумент whence указывает на отправную точку, от которой отсчитывается смещение, и может иметь следующие значения:

• SEEK_SET — файловое смещение устанавливается в байтах на расстоянии offset от начала файла;

• SEEK_CUR — смещение устанавливается в байтах на расстоянии offset относительно текущего файлового смещения;

• SEEK_END — файловое смещение устанавливается на размер файла плюс offset. Иными словами, offset рассчитывается относительно следующего байта после последнего байта файла.

Порядок интерпретации аргумента whence показан на рис. 4.1.

В ранних реализациях UNIX вместо констант SEEK_*, перечисленных выше, использовались целые числа 0, 1 и 2. В старых версиях BSD для этих значений применялись другие имена: L_SET, L_INCR и L_XTND.



Рис. 4.1. Интерпретация аргумента whence системного вызова lseek()


Если аргумент whence содержит значение SEEK_CUR или SEEK_END, то у аргумента offset может быть положительное или отрицательное значение. Для SEEK_SET значение offset должно быть неотрицательным.

При успешном выполнении lseek() возвращается значение нового файлового смещения. Следующий вызов извлекает текущее расположение файлового смещения, не изменяя его значения:

curr = lseek(fd, 0, SEEK_CUR);

В некоторых реализациях UNIX (но не в Linux) имеется нестандартная функция tell(fd), которая служит той же цели, что и описанный системный вызов lseek().

Рассмотрим некоторые другие примеры вызовов lseek(), а также комментарии, объясняющие, куда передвигается файловое смещение:

lseek(fd, 0, SEEK_SET); /* Начало файла */

lseek(fd, 0, SEEK_END); /* Следующий байт после конца файла */

lseek(fd, — 1, SEEK_END); /* Последний байт файла */

lseek(fd, — 10, SEEK_CUR); /* Десять байтов до текущего размещения */

lseek(fd, 10000, SEEK_END); /* 10 000 и 1 байт после

последнего байта файла */

Вызов lseek() просто устанавливает значение для записи ядра, содержащей файловое смещение и связанной с дескриптором файла. Никакого физического доступа к устройству при этом не происходит.

Некоторые дополнительные подробности взаимоотношений между файловыми смещениями, дескрипторами файлов и открытыми файлами рассматриваются в разделе 5.4.

Не ко всем типам файлов можно применять системный вызов lseek(). Запрещено применение lseek() к конвейеру, FIFO-устройству, сокету или терминалу — вызов аварийно завершится с установленным для errno значением ESPIPE. С другой стороны, lseek() можно применять к тем устройствам, в отношении которых есть смысл это делать, например, при наличии возможности установки на конкретное место на дисковом или ленточном устройстве.

Буква l в названии lseek() появилась из-за того, что как для аргумента offset, так и для возвращаемого значения первоначально определялся тип long. В ранних реализациях UNIX предоставлялся системный вызов seek(), в котором для этих значений определялся тип int.


Файловые дыры

Что происходит, когда программа перемещает указатель, переходя при этом за конец файла, а затем выполняет ввод-вывод? При вызове read() возвращается 0, показывающий, что достигнут конец файла. А вот записывать байты можно в произвольное место после окончания файла.

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

Файловые дыры не занимают места на диске. Файловая система не выделяет для дыры дисковые блоки до тех пор, пока в нее не будут записаны данные. Основное преимущество файловых дыр заключается в том, что для слабозаполненного файла потребляется меньше дискового пространства, чем понадобилось бы, если бы для нулевых байтов действительно нужно было выделять дисковые блоки. Файлы дампов ядра (см. раздел 22.1) — яркие примеры файлов с большими дырами.

Утверждение о том, что файловые дыры не потребляют дисковое пространство, требует уточнения. На большинстве файловых систем файловое пространство выделяется поблочно (см. раздел 14.3). Размер блока зависит от типа файловой системы, но обычно составляет 1024, 2048 или 4096 байт. Если край дыры попадает в блок, а не на границу блока, тогда для хранения байтов в другой части блока выделяется весь блок, и та часть, которая относится к дыре, заполняется нулевыми байтами.

Большинство нативных для UNIX файловых систем поддерживают концепцию файловых дыр, в отличие от многих «неродных» файловых систем (например, VFAT от Microsoft). В файловой системе, не поддерживающей дыры, в файл записывается явно указанное количество нулевых байтов.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных