Шрифт:
char *mktemp(char *template)
Генерирует уникальные имена файлов на основе шаблона. Последними шестью символами
template
должны быть 'ХХХХХХ
'; эти символы замещаются уникальным суффиксом. ЗАМЕЧАНИЕ. Аргумент
template
функции mktemp
переписывается. Поэтому он не должен быть строковой константой. Многие компиляторы, предшествовавшие стандарту С, помещают строковые константы в сегмент данных вместе с обычными глобальными переменными. Хотя в исходном коде они определены как константы, их можно переписать, таким образом, нередко встречался такой код:
/* Код в старом стиле: не используйте его */
char *tfile = mktemp("/tmp/myprogXXXXXX");
/* ...использование файла... */
На современных системах такой код. вероятно, завершится неудачей, в наши дни строковые константы находятся в сегментах памяти только для чтения.
Использование этих функций довольно просто. Файл
ch12-mktemp.c
демонстрирует mktemp
; нетрудно изменить его для использования других функций:
1 /* ch12-mktemp.с --- демонстрирует простое использование mktemp.
2 Для краткости проверка ошибок опущена */
3
4 #include <stdio.h>
5 #include <fcntl.h> /* для флагов открытия */
6 #include <limits.h> /* для PATH_MAX */
7
8 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;
15
16 strcpy(fname, template);
17 mktemp(fname);
18
19 /* ОКНО СОСТОЯНИЯ ГОНКИ ОТКРЫВАЕТСЯ */
20
21 printf("Filename is %s\n", fname);
22
23 /* ОКНО СОСТОЯНИЯ ГОНКИ ТЯНЕТСЯ ДОСЮДА */
24
25 fd = open(fname, O_CREAT|O_RDWR|O_TRUNC, 0600);
26 write(fd, mesg, strlen(mesg));
27 close(fd);
28
29 /* unlink(fname); */
30
31 return 0;
32 }
Переменная
template
(строка 10) определяет шаблон имени файла; 'ХХХХХХ
' будет заменен уникальным значением. Строка 16 копирует шаблон в fname
, которая не является константой: ее можно изменить. Строка 18 вызывает mktemp
для генерирования имени файла, а строка 21 выводит ее, так, чтобы мы могли видеть, что это такое. (Вскоре мы объясним комментарии в строках 19 и 23.) Строка 25 открывает файл, создавая его при необходимости. Строка 26 записывает сообщение в
mesg
, а строка 27 закрывает файл. В программе, в которой файл должен быть удален после завершения работы с ним, строка 29 была бы не закомментирована. (Иногда временный файл не следует удалять; например, если файл после полной записи будет переименован.) Мы закомментировали ее, чтобы можно было запустить эту программу и посмотреть на файл впоследствии. Вот что происходит при запуске программы:
$ ch12-mktemp /* Запуск программы */
Filename is /tmp/myfileQES4WA /* Вывод имени файла */
$ cat /tmp/myfileQES4WA
Here's lookin' at you, kid' /* Содержит то, что ожидалось */
$ ls -l /tmp/myfileQES4WA /* To же с владельцем и доступом */
– rw------- 1 arnold devel 28 Sep 18 09:27 /tmp/myfileQES4WA
$ rm /tmp/myfileQES4WA /* Удалить его */
$ ch12-mktemp / * Используется ли повторно то же имя? */
Filename is /tmp/myfileic7xCy /* Нет. Это хорошо */
$ cat /tmp/myfileic7xCy /* Снова проверить содержание */
Here's lookin' at you, kid!
$ ls -l /tmp/myfileic7xCy /* Снова проверить владельца и доступ */
– rw------- 1 arnold devel 28 Sep 18 09:28 /tmp/myfileic7xCy