Сведения о вопросе

LiKIY

19:16, 29th August, 2020

Теги

c   linux    

Как получить имя файла tempfile для использования в Linux?

Просмотров: 516   Ответов: 6

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



  Сведения об ответе

PAGE

13:05, 18th August, 2020

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

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

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


  Сведения об ответе

PROGA

07:21, 15th August, 2020

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


  Сведения об ответе

ASSembler

13:36, 15th August, 2020

@garethm:

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

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

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


  Сведения об ответе

ASSembler

02:26, 20th August, 2020

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

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


  Сведения об ответе

fo_I_K

10:36, 8th August, 2020

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


  Сведения об ответе

ЯЯ__4

23:20, 7th August, 2020

Вы должны использовать 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);


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться