-->

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

На нашем литературном портале можно бесплатно читать книгу Linux программирование в примерах, Роббинс Арнольд-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Linux программирование в примерах
Название: Linux программирование в примерах
Дата добавления: 16 январь 2020
Количество просмотров: 551
Читать онлайн

Linux программирование в примерах читать книгу онлайн

Linux программирование в примерах - читать бесплатно онлайн , автор Роббинс Арнольд

В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.

 

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

1 ... 30 31 32 33 34 35 36 37 38 ... 253 ВПЕРЕД
Перейти на страницу:

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

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

Прежде чем рассмотреть функцию

process()
, нам нужно описать, как представлены ошибки системных вызовов и как осуществляется ввод/вывод. Сама функция
process()
представлена в разделе 4.4.3 «Чтение и запись».

4.3. Определение ошибок

«Если неприятность может произойти, она случается»

- Закон Мерфи -

«Будь готов»

- Бойскауты -

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

Основные системные вызовы Linux почти всегда возвращают при ошибке -1 и 0 или положительное значение при успехе. Это дает возможность узнать, была операция успешной или нет:

int result;

result = some_system_call(param1, param2);

if (result < 0) {

 /* ошибка, что-нибудь сделать */

} else

 /* все нормально, продолжить */

Знания того, что произошла ошибка, недостаточно. Нужно знать, какая произошла ошибка. Для этого у каждого процесса есть предопределенная переменная с именем

errno
. Всякий раз, когда системный вызов завершается ошибкой,
errno
устанавливается в один из набора предопределенных значений ошибок
errno
и предопределенные значения ошибок определены в файле заголовка
<errno.h>
.

#include <errno.h> /* ISO С */

extern int errno;

Хотя сама

errno
может быть макросом, который действует подобно переменной
int
 — она не обязательно является действительной целой переменной. В частности, в многопоточном окружении у каждого потока будет своя индивидуальная версия
errno
. Несмотря на это, практически для всех системных вызовов и функций в данной книге вы можете рассматривать
errno
как простую
int
.

1 ... 30 31 32 33 34 35 36 37 38 ... 253 ВПЕРЕД
Перейти на страницу:
Комментариев (0)
название