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

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

Жанры

Linux программирование в примерах
Шрифт:

7. Перепишите вашу функцию с использованием

fgets
и протестируйте ее. Является ли новый код более сложным или менее сложным? Какова его производительность по сравнению с версией
getc
?

8. Изучите страницу справки V7 для end(3) (

/usr/man/man3/end.3
в дистрибутиве V7). Пролила ли она свет на то, как может работать '
sbrk(0)
'?

9. Усовершенствуйте

ch03-memaddr.c
так, чтобы она печатала расположение аргументов и переменных окружения. В какой области адресного пространства они находятся?

Глава 4

Файлы и файловый ввод/вывод

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

4.1. Введение в модель ввода/вывода Linux/Unix

Модель API Linux/Unix для ввода/вывода проста. Ее можно суммировать четырьмя словами. открыть, прочитать, записать, закрыть. Фактически, это имена системных вызовов:

open
,
read
,
write
,
close
. Вот их объявления:

#include <sys/types.h> /* POSIX */

#include <sys/stat.h> /* для mode_t */

#include <fcntl.h> /* для flags для open */

#include <unistd.h> /* для ssize_t */

int open(const char *pathname, int flags, mode_t mode);

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

int close(int fd);

В следующем и дальнейших разделах мы проиллюстрируем модель, написав очень простую версию

cat
. Она так проста, что даже не имеет опций; все, что она делает, — объединяет содержимое двух именованных файлов и выводит его в стандартный вывод. Она выводит минимум сообщений об ошибках. Написав, мы сравним ее с V7
cat
.

Мы представим программу сверху вниз, начав с командной строки. В последующих разделах мы представим обработку ошибок, а затем перейдем к сущностным задачам, показав, каким образом осуществляется реальный файловый ввод/вывод.

4.2. Представление базовой структуры программы

Наша версия cat следует структуре, которая обычно является полезной. Первая часть начинается с комментариев, заголовочных файлов, объявлений и функции main:

1 /*

2 * ch04-cat.c --- Демонстрация open, read, write, close,

3 * errno и strerror.

4 */

5

6 #include <stdio.h> /* для fprintf, stderr, BUFSIZ */

7 #include <errno.h> /* объявление errno */

8 #include <fcntl.h> /* для flags для open */

9 #include <string.h> /* объявление strerror */

10 #include <unistd.h> /* для ssize_t */

11 #include <sys/types.h>

12 #include <sys/stat.h> /* для mode_t */

13

14 char *myname;

15 int process(char *file);

16

17 /* main --- перечислить аргументы файла */

18

19 int

20 main(int argc, char **argv)

21 {

22 int i;

23 int errs = 0;

24

25 myname = argv[0];

26

27 if (argc == 1)

28 errs = process("-");

29 else

30 for (i = 1; i < argc; i++)

31 errs += process(argv[i]);

32

33 return (errs != 0);

34 }

…продолжение далее в главе.

Переменная

myname
(строка 14) используется далее для сообщений об ошибках;
main
первым делом устанавливает в ней имя программы (
argv[0]
). Затем
main
в цикле перечисляет аргументы. Для каждого аргумента она вызывает функцию
process
.

Когда в качестве имени файла дано

(простая черточка, или знак минус),
cat
Unix вместо попытки открыть файл с именем читает стандартный ввод. Вдобавок,
cat
читает стандартный ввод, когда нет аргументов.
ch04-cat
реализует оба этих поведения. Условие '
argc == 1
' (строка 27) истинно, когда нет аргументов имени файла; в этом случае
main
передает «
» функции
process
. В противном случае,
main
перечисляет аргументы, рассматривая их как файлы, которые необходимо обработать. Если один из них окажется «
», программа обрабатывает стандартный ввод.

Если

process
возвращает ненулевое значение, это означает, что случилась какая- то ошибка. Ошибки подсчитываются в переменной
errs
(строки 28 и 31). Когда
main
завершается, она возвращает 0, если не было ошибок, и 1, если были (строка 33). Это довольно стандартное соглашение, значение которого более подробно обсуждается в разделе 9.1.5.1 «Определение статуса завершения процесса».

Структура, представленная в

main
, довольно общая:
process
может делать с файлом все, что мы захотим. Например (игнорируя особый случай «
»), process также легко могла бы удалять файлы вместо их объединения!

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

Остров Крым

Аксенов Василий Павлович
Фантастика:
социально-философская фантастика
альтернативная история
8.40
рейтинг книги
Остров Крым

Политолог

Проханов Александр Андреевич
Проза:
современная проза
5.20
рейтинг книги
Политолог

Три Меченосца. Книга первая. Желтая сталь алфейнов

Маягин Владимир
Хроники Гэмдровса
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
6.33
рейтинг книги
Три Меченосца. Книга первая. Желтая сталь алфейнов

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.85
рейтинг книги
Архонт

Поход

Валериев Игорь
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
Поход

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Кодекс «Альтмана»

Линдз Гейл
4. Прикрытие-Один
Детективы:
шпионские детективы
5.75
рейтинг книги
Кодекс «Альтмана»

Лягушки

Орлов Владимир Викторович
Проза:
современная проза
7.12
рейтинг книги
Лягушки

Бездна

Кораблев Родион
21. Другая сторона
Фантастика:
боевая фантастика
рпг
уся
попаданцы
5.00
рейтинг книги
Бездна

Последний реанорец. Том VIII

Павлов Вел
7. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Последний реанорец. Том VIII

Вторжение

Тармашев Сергей Сергеевич
4. Древний
Фантастика:
боевая фантастика
9.15
рейтинг книги
Вторжение

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Газлайтер. Том 28

Приключения 1969

Голант Вениамин Яковлевич
Приключения:
прочие приключения
5.00
рейтинг книги
Приключения 1969