Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Удивительно, но имеются пять различных функций для создания временных файлов. Три из них работают посредством создания строк, представляющих (предположительно) уникальные имена файлов. Как мы увидим, их обычней следует избегать. Оставшиеся две работают путем создания и открытия временного файла; эти функции предпочтительнее для использования.
12.3.1. Создание временных имен файлов (плохо)
Имеются три функции, назначением которых является создание имени уникального, не существующего файла. Получив такое имя, вы можете использовать его для создания временного файла. Поскольку имя уникально, вам «гарантируется» исключительное использование файла. Вот объявления функций:
#include <stdio.h>char *tmpnam(char *s); /* ISO С */char *tempnam(const char *dir, const char *pfx); /* XSI */char *mktemp(char *template); /* ISO С */Все эти функции предусматривают различные вариации одной и той же темы они заполняют или создают буфер с путем уникального временного имени файла. Файл уникален в том, что создаваемое имя не существует во время создания и возвращения его функциями. Функции работают следующим образом:
char *tmpnam(char *s)Генерирует уникальное имя файла. Если
sNULLL_tmpnamsNULLP_tmpdirP_tmpdirL_tmpnam<stdio.h>char *tempnam(const char *dir, const char *pfx)Подобно
tmpnam()dirNULLP_tmpdirpfxNULLtempnam()free()char *mktemp(char *template)Генерирует уникальные имена файлов на основе шаблона. Последними шестью символами
templateХХХХХХЗАМЕЧАНИЕ. Аргумент
templatemktemp()/* Код в старом стиле: не используйте его */char *tfile = mktemp("/tmp/myprogXXXXXX");/* ...использование файла... */На современных системах такой код. вероятно, завершится неудачей, в наши дни строковые константы находятся в сегментах памяти только для чтения.
Использование этих функций довольно просто. Файл
ch12-mktemp.cmktemp()1 /* ch12-mktemp.с --- демонстрирует простое использование mktemp().2 Для краткости проверка ошибок опущена */34 #include <stdio.h>5 #include <fcntl.h> /* для флагов открытия */6 #include <limits.h> /* для PATH_MAX */78 int main(void)9 {10 static char template[] = "/tmp/myfileXXXXXX";11 char fname[PATH_MAX];12 static char mesg[] =13 "Here's lookin' at you, kid'n"; /* вместо "hello, world" */14 int fd;1516 strcpy(fname, template);17 mktemp(fname);1819 /* ОКНО СОСТОЯНИЯ ГОНКИ ОТКРЫВАЕТСЯ */2021 printf("Filename is %sn", fname);2223 /* ОКНО СОСТОЯНИЯ ГОНКИ ТЯНЕТСЯ ДОСЮДА */2425 fd = open(fname, O_CREAT|O_RDWR|O_TRUNC, 0600);26 write(fd, mesg, strlen(mesg));27 close(fd);2829 /* unlink(fname); */3031 return 0;32 }Переменная
templateХХХХХХfnamemktemp()Строка 25 открывает файл, создавая его при необходимости. Строка 26 записывает сообщение в
mesg