Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

12.3.2. Создание и открывание временных файлов (хорошо)

Есть две функции, не имеющие проблем состояния гонки. Одна из них предназначена для использования с библиотекой

<stdio.h>
:

#include <stdio.h> /* ISO С */

FILE *tmpfile(void);

Другая функция для использования с системными вызовами на основе дескрипторов файлов:

#include <stdio.h> /* XSI */

int mkstemp(char* template);

tmpfile
возвращает значение
FILE*
, представляющее уникальный открытый временный файл. Файл открывается в режиме "
w+b
".
w+
означает «открыть для чтения и записи, сначала урезав файл», a b означает двоичный, а не текстовый режим. (На системах GNU/Linux или Unix нет разницы, но на других системах есть.) Файл автоматически удаляется, когда закрывается указатель файла; нет способа получить имя файла, чтобы сохранить его содержимое. Программа в
ch12-tmpfile.c
демонстрирует
tmpfile
:

/* ch12-tmpfile.с --- демонстрация tmpfile.

Проверка ошибок для краткости опущена */

#include <stdio.h>

int main(void) {

 static char mesg[] =

"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
. При запуске получаем ожидавшиеся результаты:

$ ch12-tmpfile

Got back <Here's lookin' at you, kid!>

Ранее мы видели, что авторы GLIBC рекомендуют использование функции

mkstemp
:

$ cc ch12-mktemp.с -о ch12-mktemp /* Компилировать программу */

/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;

}

Поделиться:
Популярные книги

Политолог

Проханов Александр Андреевич
Проза:
современная проза
5.20
рейтинг книги
Политолог

Заговор «Аквитания»

Ладлэм Роберт
Детективы:
политические детективы
5.00
рейтинг книги
Заговор «Аквитания»

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Виктимология. Психология поведения жертвы

Малкина-Пых Ирина Германовна
Научно-образовательная:
психология
5.75
рейтинг книги
Виктимология. Психология поведения жертвы

Звездный свет (сборник)

Клемент Хол
Классика мировой фантастики
Фантастика:
научная фантастика
6.25
рейтинг книги
Звездный свет (сборник)

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Гобелены Фьонавара (сборник)

Кей Гай Гэвриел
Гобелены Фьонавара
Фантастика:
фэнтези
эпическая фантастика
6.25
рейтинг книги
Гобелены Фьонавара (сборник)

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.39
рейтинг книги
Князь Мещерский

Воронцов. Перезагрузка. Книга 4

Тарасов Ник
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.25
рейтинг книги
Чужая семья генерала драконов

Религия и этика в изречениях и цитатах. Справочник

Душенко Константин Васильевич
Религия и эзотерика:
религия
5.00
рейтинг книги
Религия и этика в изречениях и цитатах. Справочник

Афганский полигон

Кулаков Сергей Федорович
Спецназ. Группа Антитеррор
Детективы:
боевики
6.17
рейтинг книги
Афганский полигон

"Фантастика 2025-103". Компиляция. Книги 1-17

Поселягин Владимир Геннадьевич
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Фантастика 2025-103. Компиляция. Книги 1-17

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3