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

Листинг 2.6. (readfile.c) Освобождение ресурсов при возникновении аварийных ситуаций

Листинг 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() нет необходимости удалять буферы и закрывать файлы. Но некоторые другие совместно используемые ресурсы приходится все же освобождать вручную. В частности, это относится к временным файлам и совместным буферам памяти: они способны "пережить" программу.

Оглавление книги


Генерация: 1.177. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз