Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Справочная страница не углубляется в описание проблемы со встроенной
alloca()
alloca()
Все это должно убедить вас избегать
alloca()
malloc()
free()
alloca()
3.2.5. Исследование адресного пространства
Следующая программа,
ch03-memaddr.c
alloca()
brk()
sbrk()
1 /*
2 * ch03-memaddr.с --- Показать адреса секций кода, данных и стека,
3 * а также BSS и динамической памяти.
4 */
5
6 #include <stdio.h>
7 #include <malloc.h> /* для определения ptrdiff_t в GLIBC */
8 #include <unistd.h>
9 #include <alloca.h> /* лишь для демонстрации */
10
11 extern void afunc(void); /* функция, показывающая рост стека */
12
13 int bss_var; /* автоматически инициализируется в 0, должна быть в BSS */
14 int data_var = 42; /* инициализируется в не 0, должна быть
15 в сегменте данных */
16 int
17 main(int argc, char **argv) /* аргументы не используются */
18 {
19 char *p, *b, *nb;
20
21 printf("Text Locations:n");
22 printf("tAddress of main: %pn", main);
23 printf("tAddress of afunc: %pn", afunc);
24
25 printf("Stack Locations.n");
26 afunc();
27
28 p = (char*)alloca(32);
29 if (p != NULL) {
30 printf("tStart of alloca()'ed array: %pn", p);
31 printf("tEnd of alloca()'ed array: %pn", p + 31);
32 }
33
34 printf("Data Locations:n");
35 printf("tAddress of data_var: %pn", &data_var);
36
37 printf("BSS Locations:n");
38 printf("tAddress of bss_var: %pn", &bss_var);
39
40 b = sbrk((ptrdiff_t)32); /* увеличить адресное пространство */
41 nb = sbrk((ptrdiff_t)0);
42 printf("Heap Locations:n");
43 printf("tInitial end of heap: %pn", b);
44 printf("tNew end of heap: %pn", nb);
45
46 b = sbrk((ptrdiff_t)-16); /* сократить его */
47 nb = sbrk((ptrdiff_t)0);
48 printf("tFinal end of heap: %pn", nb);
49 }
50
51 void
52 afunc(void)
53 {
54 static int level = 0; /* уровень рекурсии */
55 auto int stack_var; /* автоматическая переменная в стеке */
56
57 if (++level == 3) /* избежать бесконечной рекурсии */
58 return;
59
60 printf("tStack level %d: address of stack_var: %pn",
61 level, &stack_var);
62 afunc(); /* рекурсивный вызов */
63 }
Эта программа распечатывает местонахождение двух функций
main()
afunc()
afunc()
stack_var
stack_var
auto
alloca()
sbrk()
$ <b>ch03-memaddr</b>
Text Locations:
Address of main: 0x804838c
Address of afunc: 0x80484a8
Stack Locations:
Stack level 1: address of stack_var: 0xbffff864
Stack level 2: address of stack_var: 0xbffff844
/* Стек растет вниз */