Как вы получаете имя файла tempfile для использования в Linux? - PullRequest
9 голосов
/ 27 августа 2008

Допустим, я создаю программу на C, которая должна использовать временный файл. Создание специального временного файла в / tmp, вероятно, не очень хорошая идея. Есть ли вызов функции или ОС, чтобы предоставить мне имя временного файла, чтобы я мог начать писать и читать с него?

Ответы [ 6 ]

20 голосов
/ 27 августа 2008

Для этой цели вы можете использовать функцию mkstemp(3). Другой альтернативой является функция tmpfile(3). Какой из них вы выберете, зависит от того, хотите ли вы, чтобы файл открывался как поток файлов библиотеки C (что делает tmpfile), или как прямой дескриптор файла (mkstemp). Функция tmpfile также автоматически удаляет файл после завершения программы.

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

См. Справочные страницы для обеих функций для получения более подробной информации.

5 голосов
/ 28 августа 2008

Вопрос в том, как сгенерировать временный файл name . Ни mkstemp, ни tmpfile не предоставляют вызывающей стороне имя, они возвращают дескриптор файла или дескриптор файла соответственно.

3 голосов
/ 27 августа 2008

@ garethm:

Я считаю, что функция, которую вы ищете, называется tmpnam.

Вы должны определенно не использовать tmpnam. Она страдает от проблемы состояния гонки, о которой я упоминал в своем ответе: между определением имени и его открытием другая программа может создать файл или символическую ссылку на него, что является огромной дырой в безопасности.

В справочной странице tmpnam специально сказано, что не следует использовать ее, а вместо нее следует использовать mkstemp или tmpfile.

2 голосов
/ 27 августа 2008

Абсолютно: man mkstemp.

В справочной странице есть пример использования.

1 голос
/ 27 августа 2008

Не уверен ни в чем в C lib, но вы можете сделать это в оболочке с помощью mktemp .

0 голосов
/ 31 мая 2016

Вы должны использовать mkstemp (), так как это рекомендуемая функция, но она возвращает дескриптор файла, поэтому, когда у вас есть дескриптор, получите его имя:

int fd;
fd = mkstemp("hdrXXXXXX);
/* Read out the link to our file descriptor. */
sprintf(path, "/proc/self/fd/%d", fd);
memset(result, 0, sizeof(result));
readlink(path, result, sizeof(result)-1);

/* Print the result. */
printf("%s\n", result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...