Книга: Основы программирования в Linux

Временные файлы

Временные файлы

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

У столь популярных временных файлов есть скрытый недостаток. Вы должны следить за тем, чтобы приложения выбирали уникальное имя для временного файла. Если это условие не соблюдается, могут возникнуть проблемы. Поскольку ОС Linux — многозадачная система, другая программа может выбрать то же самое имя, и обе будут мешать друг другу.

Уникальное имя файла генерируется с помощью функции tmpnam:

#include <stdio.h>
char *tmpnam(char *s);

Функция tmpnam возвращает допустимое имя файла, не совпадающее с именем любого из существующих файлов. Если строка s не равна NULL, в нее будет записано имя файла. Последующие вызовы функции tmpnam будут перезаписывать статическую память, используемую для возвращаемых значений, поэтому важно применять строковый параметр, если функция должна вызываться многократно. Длина строки полагается равной, как минимум, L_tmpnam (обычно около 20) символам. Функция tmpnam может вызываться в одной программе до TMP_MAX (не менее нескольких тысяч) раз, и каждый раз она будет генерировать уникальное имя файла.

Если, временный файл предполагается использовать немедленно, вы можете одновременно назвать его и открыть с помощью функции tmpfile. Это важно, т.к. другая программа может создать файл с именем таким же, как значение, возвращенное функцией tmpnam. Функция tmpfile устраняет эту проблему полностью.

#include <stdio.h>
FILE* tmpfile(void);

Функция tmpfile возвращает указатель потока, ссылающийся на уникальный временный файл. Файл открыт для чтения и записи (с помощью fopen с флагом w+) и будет автоматически удален, когда закроются все ссылки на него.

В случае возникновения ошибки tmpfile вернет указатель NULL и задаст значение переменной errno.

Давайте посмотрим эти две функции в действии:

#include <stdio.h>
#include <stdlib.h>
int main() {
 char tmpname[L_tmpnam];
 char* filename;
 FILE *tmpfp;
 filename = tmpnam(tmpname);
 printf("Temporary file name is: %sn", filename);
 tmpfp = tmpfile();
 if (tmpfp) printf("Opened a temporary file OKn");
 else perror("tmpfile");
 exit(0);
}

Когда вы откомпилируете и выполните программу tmpnam.с, то увидите уникальное имя файла, сгенерированное функцией tmpnam:

$ ./tmpnam
Temporary file name is: /tmp/file2S64zc
Opened a temporary file OK

Как это работает

Программа вызывает функцию tmpnam для генерации уникального имени временного файла. Если вы хотите его использовать, нужно быстро его открыть, чтобы минимизировать риск того, что другая программа откроет файл с тем же именем. Вызов функции tmpfile одновременно создает и открывает временный файл, тем самым устраняя этот риск. При компиляции программы, использующей функцию tmpnam, компилятор GNU С может вывести предупреждение о применении этой функции.

В некоторых версиях UNIX предлагается другой способ генерации имен временных файлов — с помощью функций mktemp и mkstemp. Они поддерживаются и ОС Linux и аналогичны функции tmpnam за исключением того, что вы должны задать шаблон имени временного файла, который предоставляет некоторые дополнительные возможности управления местом хранения и именем файла.

#include <stdlib.h>
char *mktemp(char *template);
int mkstemp(char *template);

Функция mktemp создает уникальное имя файла на основе заданного шаблона template. Аргумент template должен быть строкой с шестью завершающими символами Х. mktemp заменяет эти символы Х уникальной комбинацией символов, допустимых в именах файлов. Она возвращает указатель на сгенерированную строку или NULL при невозможности сформировать уникальное имя.

Функция mkstemp аналогична функции tmpfile: она создает и открывает временный файл. Имя файла генерируется так же, как в функции mktemp, но возвращенный результат — открытый низкоуровневый дескриптор файла.

Примечание

В ваших собственных программах следует всегда применять функции "создать и открыть" tmpfile и mkstemp вместо функций tmpnam и mktemp.

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


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