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

Листинг 2.5. (temp_file.c) Использование функции mkstemp()

Листинг 2.5. (temp_file.c) Использование функции mkstemp()

#include <stdlib.h>
#include <unistd.h>
/* дескриптор временного файла, созданного в функции
   write_temp_file(). */
typedef int temp_file_handle;
/* Запись указанного числа байтов из буфера во временный файл.
   Ссылка на временный файл немедленно удаляется. Возвращается
   дескриптор временного файла. */
temp_file_handle write_temp_file(char* buffer, size_t length) {
 /* Создание имени файла и самого файла. Цепочка XXXXXX будет
    заменена символами, которые сделают имя уникальным. */
 char temp_filename() = "/tmp/temp_file.XXXXXX";
 int fd = mkstemp(temp_filename);
 /* немедленное удаление ссылки на файл, благодаря чему он будет
    удален сразу же после закрытия дескриптора файла. */
 unlink(temp_filename);
 /* Сначала в файл записывается число, определяющее размер
    буфера. */
 write(fd, &length, sizeof(length));
 /* теперь записываем сами данные. */
 write(fd, buffer, length);
 /* Возвращаем дескриптор файла. */
 return fd;
}
/* Чтение содержимого временного файла, созданного в функции
   write_temp_file(). Создается и возвращается буфер с содержимым
   файла. Этот буфер должен быть удален в вызывающей подпрограмме
   с помощью функции free(). В параметр LENGTH записывается размер
   буфера в байтах. В конце временный файл удаляется. */
char* read_temp_file(temp_file_handle temp_file, size_t* length) {
 char* buffer;
 /* TEMP_FILE -- это дескриптор временного файла. */
 int fd = temp_file;
 /* переход в начало файла. */
 lseek(fd, 0, SEEK_SET);
 /* Определение объема данных, содержащихся во временном файле. */
 read(fd, length, sizeof(*length));
 /* Выделение буфера и чтение данных. */
 buffer = (char*)malloc(*length);
 read(fd, buffer, *length);
 /* Закрытие дескриптора файла, что приведет к уничтожению
    временного файла. */
 close(fd);
 return buffer;
}

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


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