Марк Митчелл - Программирование для Linux. Профессиональный подход

Тут можно читать онлайн Марк Митчелл - Программирование для Linux. Профессиональный подход - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Вильямс, год 2002. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Программирование для Linux. Профессиональный подход
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2002
  • Город:
    Москва
  • ISBN:
    5-8459-0243-6
  • Рейтинг:
    3.6/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание

Программирование для Linux. Профессиональный подход - описание и краткое содержание, автор Марк Митчелл, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.

Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)

Программирование для Linux. Профессиональный подход - читать книгу онлайн бесплатно, автор Марк Митчелл
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

С целью выявления ошибок доступа библиотека Electric Fence запрашивает для каждой выделенной области как минимум две страницы памяти. По умолчанию конец области приходится на конец первой страницы. Выход за пределы области, т.е. обращение ко второй странице, вызывает ошибку сегментации. Если переменная EF_PROTECT_BELOWравна 1, начало области выравнивается по началу второй страницы. В связи с тем, что за один вызов функции malloc()выделяется не менее двух страниц памяти, библиотека Electric Fence способна потреблять достаточно много памяти, поэтому ее рекомендуется использовать только при отладке.

А.2.6. Выбор средств отладки

Мы рассмотрели четыре разных, несовместимых друг с другом средства диагностирования неправильных случаев использования динамической памяти. Ни одно из средств не гарантирует нахождение всех ошибок, но это лучше, чем полное отсутствие проверок. Чтобы облегчить поиск ошибок, выделите код, в котором происходит работа с динамической памятью. Если программа пишется на C++, создайте класс, обрабатывающий все обращения к динамической памяти. При написании программы на языке С постарайтесь минимизировать число функций, в которых выделяется и освобождается память. Тестируя программу, не забывайте о том, что одновременно должно использоваться только одно средство отладки памяти, так как эти средства несовместимы.

Какое же из четырех средств выбрать? Поскольку чаще всего забывают согласовать число операций выделения и освобождения памяти, на начальных этапах разработки лучше применять утилиту mtrace. Она доступна во всех Linux-системах и хорошо себя зарекомендовала. Пройдя данную фазу тестирования, воспользуйтесь утилитой Electric Fence для нахождения неправильных обращений к памяти. Связка двух этих утилит позволяет найти практически все ошибки, связанные с использованием динамической памяти.

А.2.7. Исходный текст программы, работающей с динамической памятью

В листинге А.2 показан исходный текст программы, на примере которой иллюстрируется выделение, освобождение и использование динамической памяти. Описание программы было дано в разделе А.2.1, "Программа для тестирования динамической памяти".

Листинг А.2. ( malloc-use.c ) Пример работы с динамической памятью

/ * Использование функций работы с динамической памятью. */

/* Программе передается один аргумент, определяющий

размер массива. Этот массив состоит из указателей

на (возможно) выделенные буферы памяти.

В процессе работы программы ей можно задавать

следующие команды:

выделение памяти -- а <���индекс> <���размер_буфера>

освобождение памяти -- d <���индекс>

чтение памяти -- r <���индекс> <���смещение>

запись в память -- w <���индекс> <���смещение>

выход -- q

Ответственность за соблюдение правил доступа

к динамической памяти лежит на пользователе. */

#ifdef MTRACE

#include

#endif /* MTRACE */

#include

#include

#include

/* Выделение памяти указанного размера. */

void allocate(char** array, size_t size) {

*array = malloc(size);

}

/* Освобождение памяти. */

void deallocate(char** array) {

free((void*)*array);

}

/* Чтение указанной ячейки памяти. */

void read_from_memory(char* array, int position) {

volatile char character = array[position];

}

/* Запись в указанную ячейку памяти. */

void write_to_memory(char* array, int position) {

array[position] = 'a';

}

int main{int argc, char* argv[]) {

char** array;

unsigned array_size;

char command[32];

unsigned array_index;

char command_letter;

int size_or_position;

int error = 0;

#ifdef MTRACE

mtrace();

#endif /* MTRACE */

if (argc != 2) {

fprintf(stderr, "%s: array-size\n", argv[0]);

return 1;

}

array_size = strtoul(argv[1], 0, 0);

array = (char**)calloc(array_size, sizeof(char*));

assert(array != 0);

/* Выполнение вводимых пользователем команд. */

while (!error) {

printf("Please enter a command: ");

command_letter = getchar();

assert(command_letter != EOF);

switch (command_letter) {

case 'a':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

allocate(&(array[array_index]), size_or_position);

else

error = 1;

break;

case 'd':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u", &array_index) == 1 &&

array_index < array_size)

deallocate(&(array[array_index]));

else

error = 1;

break;

case 'r':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

read_from_memory(array[array_index], size_or_position);

else

error = 1;

break;

case 'w':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

write_to_memory(array[array_index], size_or_position);

else

error = 1;

break;

case 'q':

free((void*)array);

return 0;

default:

error = 1;

}

}

free((void*)array);

return 1;

}

A.3. Профилирование

Теперь, когда мы знаем, как искать ошибки в программах, настало время разобраться, как ускорить выполнение программы. Профайлер gprofпозволяет определить, какие функции требуют наибольших вычислительных ресурсов и тем самым являются кандидатами на оптимизацию. Профилирование полезно также при отладке, поскольку с помощью этого метода можно установить, какие функции вызываются чаще, чем нужно.

Для получения профильной информации необходимо следовать такому алгоритму.

1. Скомпилируйте и скомпонуйте программу с опциями профилирования.

2. Запустите программу, чтобы сгенерировать профильные данные.

3. Вызовите утилиту gprofдля отображения и анализа профильных данных.

А.3.1. Простейший калькулятор

Для иллюстрации методики профилирования мы напишем простейшую программу- калькулятор. Чтобы программа выполнялась нетривиальным образом, заставим ее работать с унарными числами, чего не встречается в реальных калькуляторах. Код программы приведен в конце приложения.

Значение унарного числа представляется аналогичным количеством символов. Например, число 1 — это "x", 2 — "xx", 3 — "xxx" и т.д. Вместо символов "x" программа использует связный список, количество элементов которого соответствует значению числа. В файле number.cсодержатся функции, позволяющие создавать число 0, добавлять единицу к числу, вычитать единицу из числа, а также складывать, вычитать и умножать числа. Есть функция, которая преобразует строку, содержащую неотрицательное десятичное число, в унарное число. Другая функция преобразует унарное число в значение типа int. Сложение реализуется путем последовательного добавления единицы, вычитание — путем последовательного отнимания единицы, а умножение — путем многократного сложения. Функции even()и odd()возвращают унарный эквивалент единицы тогда и только тогда, когда их единственный операнд является соответственно четным или нечетным числом. В противном случае возвращается унарный эквивалент нуля. Обе функции взаимно рекурсивны. Например, число является четным, если оно равно нулю или если число, на единицу меньшее, является нечетным.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Марк Митчелл читать все книги автора по порядку

Марк Митчелл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Программирование для Linux. Профессиональный подход отзывы


Отзывы читателей о книге Программирование для Linux. Профессиональный подход, автор: Марк Митчелл. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x