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

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

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

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

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

 

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

Перейти на страницу:

Пакет

dbug
требует от вас использования определенного порядка при написании своего кода. В частности, нужно использовать его макросы при возвращении из функции или вызове
setjmp()
и
longjmp()
. Нужно добавлять один вызов макроса в качестве первого исполняемого оператора каждой функции и вызвать несколько дополнительных макросов из
main()
. Наконец, нужно добавить отладочную опцию командной строки, по соглашению, это
-#
, которая редко используется в качестве действительной опции, если вообще используется. В обмен на дополнительную работу вы получаете все только что очерченные преимущества. Давайте взглянем на пример в руководстве:

1  #include <stdio.h>

2  #include "dbug.h"

3

4  int

5  main(argc, argv)

6  int argc;

7  char *argv[];

8  {

9   register int result, ix;

10  extern int factorial(), atoi();

11

12  DBUG_ENTER("main");

13  DBUG_PROCESS(argv[0]);

14  DBUG_PUSH_ENV("DBUG");

15  for (ix = 1; ix < argc && argv[ix][0] == '-'; ix++) {

16   switch (argv[ix][1]) {

17   case '#':

18    DBUG_PUSH(&(argv[ix][2]));

19    break;

20   }

21  }

22  for (; ix < argc; ix++) {

23   DBUG_PRINT("args", ("argv[%d] = %s", ix, argv[ix]));

24   result = factorial(atoi(argv(ixj));

25   printf("%dn", result);

26   fflush(stdout);

27  }

28  DBUG_RETURN(0);

29 }

Эта программа иллюстрирует большинство важных моментов. Макрос

DBUG_ENTER()
(строка 12) должен быть вызван после объявлений переменных и перед любым другим кодом. (Это потому, что он сам объявляет несколько частных переменных. [176])

Макрос

DBUG_PROCESS()
(строка 13) устанавливает имя программы, главным образом, для использования в выводимых библиотекой сообщениях. Этот макрос должен вызываться лишь однажды, из
main()
.

Макрос

DBUG_PUSH_ENV()
(строка 14) заставляет библиотеку проверить указанную переменную окружения (в данном случае
DBUG
) на предмет управляющей строки (Управляющие строки
dbug
вскоре будут рассмотрены.) Библиотека может, сохранив свое текущее состояние и использовав новое, создавать стек сохраненных состояний. Таким образом, этот макрос помещает в стек сохраненных состояний полученное от данной переменной окружения состояние. В данном примере использован случай, когда макрос создает первоначальное состояние. Если такой переменной окружения нет, ничего не происходит. (В качестве отступления,
DBUG
является довольно общей переменной, возможно,
GAWK_DBUG
было бы лучше [для
gawk
].)

Макрос

DBUG_PUSH
(строка 18) передает значение управляющей строки, полученной из опции командной строки
-#
. (Новый код должен использовать
getopt()
или
getopt_long()
вместо ручного анализа аргументов.) Таким образом обычно включается режим отладки, но использование переменной окружения предоставляет также дополнительную гибкость.

Макрос

DBUG_PRINT()
(строка 23) осуществляет вывод. Второй аргумент использует методику, которую мы описали ранее (см. раздел 15.4.1.1 «Используйте отладочные макросы»), по включению в скобки всего списка аргументов
printf()
, делая его простым аргументом, насколько это касается препроцессора С. Обратите внимание, что завершающий символ конца строки в форматирующей строке не указывается; библиотека
dbug
вставляет его за вас.

При печати

dbug
по умолчанию выводит все операторы
DBUG_PRINT()
. Первый аргумент является строкой, которая может использоваться для ограничения вывода лишь теми макросами
DBUG_PRINT()
, которые используют эту строку.

Наконец, макрос

DBUG_RETURN()
(строка 28) используется вместо обычного оператора
return
для возврата значения. Для использования с функциями
void
имеется соответствующий макрос
DBUG_VOID_RETURN
.

Оставшаяся часть программы заполнена функцией

factorial()
:

1  #include <stdio.h>

2  #include "dbug.h"

3

4  int factorial (value)

5  register int value;

6  {

7   DBUG_ENTER("factorial");

8   DBUG_PRINT("find", ("find %d factorial", value));

9   if (value > 1) {

10   value *= factorial(value — 1);

11  }

12  DBUG_PRINT("result", ("result is %d", value));

13  DBUG_RETURN(value);

14 }

Когда программа откомпилирована и скомпонована вместе с библиотекой

dbug
, ее можно запустить обычным способом. По умолчанию, программа не создает вывод отладки. Но со включенной отладкой доступны различные виды вывода:

$ <b>factorial 1 2 3</b> /* Обычный запуск, без отладки */

1

2

Перейти на страницу:
Комментариев (0)
название