Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

$ cat myfile >> myfile /* Добавить копию myfile к себе? */

И конечно же, проверка работает:

$ echo hi > myfile /* Создать файл */

$ v7cat myfile >> myfile /* Попытка добавить файл к себе */

cat: input myfile is output

Если вы попробуете это с

ch04-cat
, программа продолжит работу, и
myfile
будет расти до тех пор, пока вы не прервете ее. GNU версия
cat
осуществляет эту проверку. Обратите внимание, что что-то вроде этого выходит за рамки контроля
cat
:

$ v7cat < myfile > myfile

cat: input - is output

$ ls -l myfile

– rw-r--r-- 1 arnold devel 0 Mar 24 14:17 myfile

В данном случае это слишком поздно, поскольку оболочка урезала файл

myfile
(посредством оператора
>
) еще до того, как
cat
получила возможность исследовать файл! В разделе 5.4.4.2 «Возвращаясь к V7 cat» мы объясним код с
struct stat
.

4.5. Произвольный доступ: перемещения внутри файла

До сих пор мы обсуждали последовательный ввод/вывод, при котором данные читаются или записываются с начала файла и продолжаются до его конца. Часто это все, что требуется программе. Однако, возможно осуществление произвольного ввода/вывода; т.е. читать данные из произвольного положения в файле без необходимости предварительного чтения всего, что находится перед этим местом.

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

lseek
:

#include <sys/types.h> /* для off_t; POSIX */

#include <unistd.h> /* объявления lseek и значений whence */

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

Тип

off_t
(тип смещения) является знаковым целым, представляющим позиции байтов (смещений от начала) внутри файла. На 32-разрядных системах тип представлен обычно как
long
. Однако, многие современные системы допускают очень большие файлы, в этом случае
off_t
может быть более необычным типом, таким, как C99
int64_t
или какой-нибудь другой расширенный тип.
lseek
принимает три следующих аргумента.

int fd

Дескриптор открытого файла.

off_t offset

Позиция, в которую нужно переместиться. Интерпретация этого значения зависит от параметра

whence
.
offset
может быть положительным или отрицательным; отрицательные значения перемещают к началу файла; положительные значения перемещают к концу файла.

int whence

Описывает положение в файле, относительно которого отсчитывается

offset
. См. табл. 4.4.

Таблица 4.4. Значения

whence
для
lseek

Именованная константа Значение Комментарий
SEEK_SET
0
offset
абсолютно, т.е. относительно начала файла
SEEK_CUR
1
offset
относительно текущей позиции в файле
SEEK_END
2
offset
относительно конца файла.

Большое количество старого кода использует числовые значения, приведенные в табл. 4.4. Однако, любой новый код, который вы пишете, должен использовать символические имена, значение которых более ясно.

Смысл значений и их действие на положение в файле показаны на рис. 4.1. При условии, что файл содержит 3000 байтов и что перед каждым вызовом

lseek
текущим является смещение 2000 байтов, новое положение после каждого вызова будет следующим.

Рис. 4.1. Смещения для

lseek

Отрицательные смещения относительно начала файла бессмысленны; они вызывают ошибку «недействительный параметр».

Возвращаемое значение является новым положением в файле. Поэтому, чтобы получить ваше текущее местоположение в файле, используйте

off_t curpos;

...

curpos = lseek(fd, (off_t)0, SEEK_CUR);

Буква

l
в
lseek
означает
long
.
lseek
был введен в V7 Unix, когда размеры файлов были увеличены; в V6 был простой системный вызов
seek
. В результате большое количество старой документации (и кода) рассматривает параметр offset как имеющий тип
long
, и вместо приведения к типу
off_t
довольно часто можно видеть суффикс L в константных значениях смешений:

  • Читать дальше
  • 1
  • ...
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: