2.2.4. Ошибки выделения ресурсов
2.2.4. Ошибки выделения ресурсов
Обычно при неудачном выполнении системного вызова наиболее приемлемое решение — отменить текущую операцию, но не завершить программу, так как можно восстановить ее нормальную работу. Один из способов сделать это — выйти из текущей функции, передав через оператор return код ошибки вызывающему модулю.
В случае, когда выход осуществляется посреди функции, важно убедиться в том, что ресурсы, выделенные в функции ранее, освобождены. К таким ресурсам относятся буферы памяти, дескрипторы и указатели файлов, временные файлы, объекты синхронизации и т.д. В противном случае, если программа продолжит выполняться, ресурсы окажутся потерянными.
В качестве примера рассмотрим функцию, загружающую содержимое файла в буфер. Функция выполняет такую последовательность действий:
1. выделяет буфер;
2. открывает файл;
3. читает содержимое файла и записывает его в буфер;
4. закрывает файл;
5. возвращает буфер вызывающему модулю.
Если файл не существует, этап 2 закончится неудачей. Подходящая реакция в этом случае — вернуть из функции значение NULL. Но если буфер уже был выделен на этапе 1, существует опасность потери этого ресурса. Нужно не забыть освободить буфер где-то в программе. Если же неудачей завершится этап 3, требуется не только освободить буфер перед выходом из функции, но и закрыть файл.
В листинге 2.6 показан пример реализации такой функции.
Листинг 2.6. (readfile.c) Освобождение ресурсов при возникновении аварийных ситуаций
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
char* read_from_file(const char* filename, size_t length) {
char* buffer;
int fd;
ssize_t bytes_read;
/* Выделяем буфер. */
buffer = (char*)malloc(length);
if (buffer == NULL)
return NULL;
/* Открываем файл. */
fd = open(filename, O_RDONLY);
if (fd == 1) {
/* Открыть файл не удалось. Освобождаем буфер
перед выходом. */
free(buffer);
return NULL;
}
/* Чтение данных. */
bytes_read = read(fd, buffer, length);
if (bytes_read != length) {
/* Чтение не удалось. Освобождаем буфер и закрываем файл
перед выходом. */
free(buffer);
close(fd);
return NULL;
}
/* Все прошло успешно. Закрываем файл и возвращаем буфер
в программу. */
close(fd);
return buffer;
}
При завершении программы операционная система Linux освобождает выделенную память, ссылки на открытые файлы и большинство других ресурсов, поэтому перед вызовом функции exit() нет необходимости удалять буферы и закрывать файлы. Но некоторые другие совместно используемые ресурсы приходится все же освобождать вручную. В частности, это относится к временным файлам и совместным буферам памяти: они способны "пережить" программу.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Параметры выделения
Параметры выделения Мы знаем множество способов привлечь внимание посетителя к определенным элементам Web-страниц, использовав теги HTML или атрибуты стиля CSS. Но CSS 3 предлагает нам еще один способ сделать это — так называемое выделение.Именно о нем сейчас и пойдет
Параметры выделения
Параметры выделения Мы знаем множество способов привлечь внимание посетителя к определенным элементам Web-страниц, использовав теги HTML или атрибуты стиля CSS. Но CSS 3 предлагает нам еще один способ сделать это — так называемое выделение.Именно о нем сейчас и пойдет
Глава 8 Операции выделения
Глава 8 Операции выделения При совершении различных операций над фрагментами изображения эти фрагменты нужно выделять. Так, например, если вы хотите применить эффект или изменить яркость только для отдельного фрагмента картинки, этот фрагмент необходимо выделить. Иначе
Инструменты выделения
Инструменты выделения Программа Photoshop предлагает несколько инструментов для выделения изображения.Начнем с самого простого, то есть с инструмента Прямоугольная область. При выборе этого инструмента указатель мыши принимает вид перекрестья. В первую очередь необходимо
Общие методы выделения
Общие методы выделения Чтобы выделить все изображение (или весь активный слой), нужно выполнить команду меню Выделение ? Все или нажать сочетание клавиш Ctrl+A. Чтобы отменить выделение, выполните команду меню Выделение ? Отменить выделение или нажмите сочетание клавиш Ctrl+D.
Выделения
Выделения Типографика предусматривает несколько вариантов выделений в тексте. Для каких-либо слов или фрагментов текста мы можем использовать различные начертания гарнитуры, изменение расстояния между символами и т. д. Однако не все виды выделения, которые вы сможете
Инструменты выделения
Инструменты выделения Ключевым моментом в работе над монтажом изображения является порядок и способ выделения контуров определенных силуэтов или иных элементов изображения. Прежде чем, например, копировать ту или иную часть изображения, мы прежде всего должны
Трансформации выделения
Трансформации выделения Как правило, бывает полезно доработать форму выделения региона уже после применения инструментов выделения. С этой целью мы можем воспользоваться специальном набором опций, который называется Transform Selection (Трансформировать выделение). Они
Сохранение и загрузка выделения
Сохранение и загрузка выделения Сохранение и загрузка выделения – специальные опции, позволяющие запомнить и возобновлять выделение того или иного элемента или их совокупностей. Мы можем однажды выделить какой-либо регион на изображении, сохранить данное выделение и в
Понятие выделения
Понятие выделения Создавая выделение, мы обозначаем в документе область, с которой хотим работать, а вся остальная часть документа для редактирования становится недоступной. Это правило справедливо для всех случаев, когда мы работаем с инструментами и командами
Редактирование выделения
Редактирование выделения Как правило, созданное выделение не идеально и содержит ошибки, что делает невозможным использовать его для работы, которая требует точности и высокого качества. Поэтому важно знать арсенал средств для редактирования выделения и уметь
Сохранение и загрузка выделения
Сохранение и загрузка выделения Как уже было сказано, качественное выделение можно получить, только работая над ним вручную и устраняя все мелкие недочеты, которые остаются после создания выделения на основе изображения. Разумеется, создать выделение в виде круга или
13.7. Получение ресурсов из библиотеки ресурсов
13.7. Получение ресурсов из библиотеки ресурсов Постановка задачи Требуется получить фотографии или видео непосредственно из библиотеки фотографий, не прибегая к использованию каких-либо встроенных компонентов графического пользовательского
1.1.3. Синтаксические выделения
1.1.3. Синтаксические выделения Помимо форматирования программного кода Emacs упрощает чтение файлов, написанных на C/C++, выделяя цветом различные синтаксические элементы. Например, ключевые слова могут быть выделены одним цветом, названия встроенных типов данных — другим, а
Инструменты выделения объектов
Инструменты выделения объектов Для выполнения какой-либо операции над конкретным объектом или группой объектов их сначала нужно выбрать, то есть выделить каким-то образом из общей совокупности объектов проекта. Примечание В дальнейшем тексте этого раздела под объектом
10.3. Дополнительное меню выделения
10.3. Дополнительное меню выделения Для вызова дополнительного меню необходимо щелкнуть внутри выделенной области правой кнопкой мыши (активным в это время должен быть один из инструментов выделения). Данное меню состоит из следующих команд.• Deselect (Снять выделение).