Linux программирование в примерах - Роббинс Арнольд
Шрифт:
Интервал:
Закладка:
"Here's lookin' at you, kid!"; /* заменяет "hello, world" */
FILE *fp;
char buf[BUFSIZ];
fp = tmpfile(); /* Получить временный файл */
fprintf(fp, "%s", mesg); /* Записать s него */
fflush(fp); /* Сбросить на диск */
rewind(fp); /* Перейти в начало */
fgets(buf, sizeof buf, fp); /* Прочесть содержимое */
printf("Got back <%s>n", buf); /* Вывести полученные данные */
fclose(fp); /* Закрыть файл, закончить */
return 0; /* Все сделано */
}
Возвращенное значение FILE* не отличается от любого другого FILE*, возвращенного fopen(). При запуске получаем ожидавшиеся результаты:
$ <b>ch12-tmpfile</b>
Got back <Here's lookin' at you, kid!>
Ранее мы видели, что авторы GLIBC рекомендуют использование функции mkstemp():
$ <b>cc ch12-mktemp.с -о ch12-mktemp</b> /* Компилировать программу */
/tmp/cc1XCvD9.о(.text+0x35): In function "main':
: the use of 'mktemp' is dangerous, better use 'mkstemp'
Эта функция похожа на mktemp() в том, что она принимает имя файла, оканчивающееся на 'ХХХХХХ', и заменяет эти символы уникальным суффиксом для создания уникального имени файла. Однако, она идет на один шаг дальше. Она создает и открывает файл. Файл создается с доступом 0600 (т.е. -rw-------). Таким образом, доступ к файлу может получить только пользователь, запустивший программу.
Более того, и это то, что делает mkstemp() более безопасной, файл создается с флагом O_EXCL, который гарантирует, что файл не существует, и не дает никому больше открыть файл.
Возвращаемое значение является дескриптором открытого файла, который может использоваться для чтения и записи. Для удаления файла после завершения работы с ним должно использоваться имя пути, сохраненное теперь в переданном mkstemp() буферу. Все это демонстрируется в ch12-mkstemp.c, который является простой модификацией ch12-tmpfile.с:
/* ch12-mkstemp.с --- демонстрирует mkstemp().
Проверка ошибок для краткости опущена */
#include <stdio.h>
#include <fcntl.h> /* для флагов открытия */
#include <limits.h> /* для PATH_МАХ */
int main(void) {
static char template[] = "/tmp/myfileXXXXXX";
char fname[PATH_MAX];
static char mesg[] =
"Here's lookin' at you, kid!n"; /* заменяет "hello, world" */
int fd;
char buf[BUFSIZ];
int n;
strcpy(fname, template); /* Копировать шаблон */
fd = mkstemp(fname); /* Создать и открыть временный файл */
printf("Filename is %sn", fname); /* Вывести его для сведений */
write(fd, mesg, strlen(mesg)); /* Что-нибудь записать в файл */
lseek(fd, 0L, SEEK_SET); /* Перейти в начало */
n = read(fd, buf, sizeof(buf));
/* Снова прочесть данные; НЕ завышается ' '! */
printf("Got back: %.*s", n, buf); /* Вывести его для проверки */
close(fd); /* Закрыть файл */
unlink(fname); /* Удалить его */
return 0;
}
При запуске получаем ожидавшиеся результаты:
$ <b>ch12-mkstemp</b>
Filename is /tmp/myfileuXFWIN
Got back: Here's lookin' at you, kid!
12.3.3. Использование переменной окружения TMPDIR
Многие стандартные утилиты обращают внимание на переменную окружения TMPDIR, используя обозначенный в ней каталог в качестве места для помещения временных файлов. Если TMPDIR не установлена, каталогом по умолчанию для временных файлов обычно является /tmp, хотя на многих современных системах есть также и каталог /var/tmp. /tmp обычно очищается от всех файлов и каталогов административными сценариями оболочки при запуске.
Многие системы GNU/Linux предоставляют каталог /dev/shm, использующий файловую систему типа tmpfs:
$ <b>df</b>
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 6198436 5136020 747544 88% /
/dev/hda5 61431520 27720248 30590648 48% /d
none 256616 0 256616 0% /dev/shm
Тип файловой системы tmpfs предоставляет электронный (RAM) диск: часть памяти, которая используется, как если бы она была диском. Более того, файловая система tmpfs использует механизмы виртуальной памяти ядра Linux для его увеличения сверх фиксированного размера. Если на вашей системе уйма оперативной памяти, этот подход может обеспечить заметное ускорение. Чтобы протестировать производительность, мы начали с файла /usr/share/dict/linux.words, который является отсортированным списком правильно написанных слов, по одному в строке. Затем мы перемешали этот файл, так что он больше не был сортированным, и создали больший файл, содержащий 500 копий спутанной версии файла: