Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Start of alloca()'ed array: 0xbffff860 End of alloca()'ed array: 0xbffff87f /* Адреса находятся в стеке */Data Locations: Address of data_var: 0x80496b8BSS Locations: Address of bss_var: 0x80497c4 /* BSS выше инициализированных данных */Heap Locations: Initial end of heap: 0x80497c8 /* Куча непосредственно над BSS */ New end of heap: 0x80497e8 /* И растет вверх */ Final end of heap: 0x80497d8 /* Адресные пространства можно сокращать */3.3. Резюме
• У каждой программы Linux и (Unix) есть различные области памяти. Они хранятся в разных частях файла исполняемой программы на диске. Некоторые из секций загружаются при запуске программы в одну и ту же область памяти. Все запушенные экземпляры одной и той же программы разделяют исполняемый код (сегмент текста). Программа
size• В адресном пространстве запушенной программы могут быть дыры, а размер адресного пространства может изменяться при выделении и освобождении памяти. На современных системах адрес 0 не является частью адресного пространства, поэтому не пытайтесь разыменовывать указатели
NULL• На уровне языка С память выделяется с помощью одной из функций
malloc()calloc()realloc()free()realloc()• Необходимо предпринять чрезвычайные меры осторожности в следующих случаях
• освобождать лишь память, выделенную с помощью соответствующих процедур,
• освобождать память один и только один раз,
• освобождать неиспользуемую память и
• не допускать «утечки» динамически выделяемой памяти.
• POSIX предоставляет для удобства функцию
strdup()getline()getdelim()brk()sbrk()alloca()Упражнения
1. Начав со структуры —
struct line { size_t buflen; char *buf; FILE* fp;};— напишите свою собственную функцию
readline()fgetc()getc()2. Сохраняет ли ваша функция завершающий символ конца строки? Объясните, почему.
3. Как ваша функция обрабатывает строки, оканчивающиеся CR-LF?
4. Как вы инициализируете структуру? В отдельной процедуре? С помощью документированных условий для определенных значений в структуре?
5. Как вы обозначаете конец файла? Как вы указываете, что возникла ошибка ввода/вывода? Должна ли ваша функция сообщать об ошибках? Объясните, почему.
6. Напишите программу, которая использует вашу функцию для ее тестирования, а также другую программу, создающую входные данные для первой программы. Протестируйте функцию.
7. Перепишите вашу функцию с использованием
fgets()getc()8. Изучите страницу справки V7 для end(3) (
/usr/man/man3/end.3sbrk(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);В следующем и дальнейших разделах мы проиллюстрируем модель, написав очень простую версию
catcat