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

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

Жанры

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 также легко могла бы удалять файлы вместо их объединения!

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

Егерь. Звери и люди

Скиба Николай
11. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Егерь. Звери и люди

Клоун

Юань Е
1. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Клоун

Рыцарь из ниоткуда. Сборник

Бушков Александр Александрович
Сварог
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Рыцарь из ниоткуда. Сборник

Все московские повести (сборник)

Трифонов Юрий Валентинович
Проза:
советская классическая проза
5.00
рейтинг книги
Все московские повести (сборник)

Приграничное владение 2

Матюшенко Артем Юрьевич
2. Приграничное владение
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Приграничное владение 2

Избранные произведения. Том 4

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

Верная Рука

Май Карл Фридрих
Виннету
Приключения:
приключения про индейцев
6.25
рейтинг книги
Верная Рука

Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Шалаева Галина Петровна
Научно-образовательная:
педагогика
5.00
рейтинг книги
Как воспитать здорового и умного ребенка. Ваш малыш от А до Я

Иоанна Хмелевская (Избранное)

Хмелевская Иоанна
Детективы:
исторические детективы
5.00
рейтинг книги
Иоанна Хмелевская (Избранное)

Спящие красавицы

Кинг Оуэн
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Спящие красавицы

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Неучтенный элемент. Том 10

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Ключи к успеху

МакКаллум Джон
Дом и Семья:
спорт
5.00
рейтинг книги
Ключи к успеху

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации