Linux программирование в примерах
Часть 170 из 253 Информация о книге
"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 %s\n", fname); /* Вывести его для сведений */write(fd, mesg, strlen(mesg)); /* Что-нибудь записать в файл */lseek(fd, 0L, SEEK_SET); /* Перейти в начало */n = read(fd, buf, sizeof(buf));/* Снова прочесть данные; НЕ завышается '\0'! */printf("Got back: %.*s", n, buf); /* Вывести его для проверки */close(fd); /* Закрыть файл */unlink(fname); /* Удалить его */return 0;}При запуске получаем ожидавшиеся результаты:
$ <b>ch12-mkstemp</b>Filename is /tmp/myfileuXFWINGot back: Here's lookin' at you, kid!12.3.3. Использование переменной окружения
TMPDIRМногие стандартные утилиты обращают внимание на переменную окружения
, используя обозначенный в ней каталог в качестве места для помещения временных файлов. ЕслиTMPDIRне установлена, каталогом по умолчанию для временных файлов обычно являетсяTMPDIR, хотя на многих современных системах есть также и каталог/tmp./var/tmpобычно очищается от всех файлов и каталогов административными сценариями оболочки при запуске./tmpМногие системы GNU/Linux предоставляют каталог
, использующий файловую систему типа/dev/shmtmpfs:$ <b>df</b>Filesystem 1K-blocks Used Available Use% Mounted on/dev/hda2 6198436 5136020 747544 88% //dev/hda5 61431520 27720248 30590648 48% /dnone 256616 0 256616 0% /dev/shmТип файловой системы
предоставляет электронный (RAM) диск: часть памяти, которая используется, как если бы она была диском. Более того, файловая системаtmpfsиспользует механизмы виртуальной памяти ядра Linux для его увеличения сверх фиксированного размера. Если на вашей системе уйма оперативной памяти, этот подход может обеспечить заметное ускорение. Чтобы протестировать производительность, мы начали с файлаtmpfs, который является отсортированным списком правильно написанных слов, по одному в строке. Затем мы перемешали этот файл, так что он больше не был сортированным, и создали больший файл, содержащий 500 копий спутанной версии файла:/usr/share/dict/linux.words