Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

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

Шрифт:

36 }

37 if (argc < 2) {

38 argc = 2;

39 fflg++;

40 }

41 while (--argc > 0) { // Loop over files

42 if (fflg || (*++argv)[0] == '-' && (*argv)[1] == '\0')

43 fi = stdin;

44 else {

45 if ((fi = fopen(*argv, "r")) == NULL) {

46 fprintf(stderr, "cat: can't open %s\n", *argv);

47 continue;

48 }

49 }

50 fstat(fileno(fi), &statb); /*
Строки 50-56 объясняются в главе 5 */

51 if (statb.st_dev == dev && statb.st_ino == ino) {

52 fprintf(stderr, "cat: input %s is output\n",

53 fflg ? "-" : *argv);

54 fclose(fi);

55 continue;

56 }

57 while ((c=getc(fi)) != EOF) /* Копировать содержимое в stdout */

58 putchar(с);

59 if (fi != stdin)

60 fclose(fi);

61 }

62 return(0);

63 }

Следует заметить, что программа всегда завершается успешно (строка 62); можно было написать ее так, чтобы отмечать ошибки и указывать их в возвращаемом значении

main
. (Механизм завершения процесса и значение различных кодов завершения обсуждаются в разделе 9.1.5.1 «Определение статуса завершения процесса».)

Код, работающий с

struct stat
и функцией
fstat
(строки 31–36 и 50–56), без сомнения, непрозрачен, поскольку мы еще не рассматривали эти функции и не будем рассматривать до следующей главы (Но обратите внимание на использование
fileno
в строке 50 для получения нижележащего дескриптора файла, связанного с переменными
FILE*
.) Идея в основе этого кода заключается в том, чтобы убедиться, что входной и выходной файлы не совпадают. Это предназначено для предотвращения бесконечного роста файла, в случае подобной команды:

$ 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
относительно конца файла.
Поделиться:
Популярные книги

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Турнир

Скиба Николай
7. Зверолов
Фантастика:
фэнтези
рпг
уся
фантастика: прочее
попаданцы
6.00
рейтинг книги
Турнир

Чай и водка в истории России

Похлебкин Вильям Васильевич
Дом и Семья:
кулинария
6.25
рейтинг книги
Чай и водка в истории России

Деспот

Арская Арина
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

Странники

Измайлова Кира Алиевна
Фантастика:
фэнтези
юмористическая фантастика
8.77
рейтинг книги
Странники

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

За миллиард лет до конца света (сборник)

Стругацкие Аркадий и Борис
Фантастика:
научная фантастика
8.45
рейтинг книги
За миллиард лет до конца света (сборник)

Достоевский

Гроссман Леонид Петрович
357. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Достоевский

Законник Российской Империи

Ткачев Андрей Юрьевич
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Законник Российской Империи

Первый среди равных. Книга IX

Бор Жорж
9. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IX

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
Наша навсегда

Большая Советская Энциклопедия (РЫ)

Большая Советская Энциклопедия
Справочная литература:
энциклопедии
5.00
рейтинг книги
Большая Советская Энциклопедия (РЫ)

Гуманитарное знание и вызовы времени

Коллектив авторов
Humanitas
Научно-образовательная:
культурология
5.00
рейтинг книги
Гуманитарное знание и вызовы времени

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X