Когда файл, созданный с помощью mkstemp(), удаляется?

У меня есть программа, которая вызывает mkstemp(), пишет некоторые вещи с возвращенным fd, а затем закрывает fd. Я хочу, чтобы файл оставался, пока я сам его не удалю! С чем-то вроде команды rm или чем-то еще. Мой вопрос: удалит ли Linux этот файл после закрытия (fd)?

2 ответа

Решение

Linux удалит этот файл после закрытия (fd)?

Не автоматически Вам нужно позвонить unlink на файл вручную. Вы можете сделать это сразу после звонка mkstemp если вам не нужен доступ к файлу по имени (т.е. через файловую систему) - он будет удален после закрытия дескриптора.

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

Вот пример рабочего процесса:

char filename[] = "tempfile-XXXXXX";
int fd;
if ((fd = mkstemp(filename)) == -1) {
    fprintf(stderr, "Failed with error %s\n", strerror(errno));
    return -1;
}

unlink(filename);

FILE *fh = fdopen(fd, "w");
fprintf(fh, "It worked!\n");
fclose(fh);

fclose закрывает FILE* поток, но и базовый дескриптор файла, поэтому нам не нужно явно вызывать close(fd),

Необходимые заголовки:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

Нет, когда файл создается с tmpfile()его запись в каталоге (во временном каталоге) удаляется после создания, поэтому существует только дескриптор файла, на который ссылается open что приводит к файловым индексам (в /proc/<pid>/fd каталог); как только вы позвоните close(fd)больше нет ссылок на файл.

С mkstemp() Вы должны сделать это вручную с unlink() сразу после создания.

Книга Linux Programming Interface дает лучший ответ на этот вопрос. Обратите внимание на комментарии в приведенном ниже коде.

Обычно временный файл отключается (удаляется) вскоре после открытия с помощью системного вызова unlink () (Раздел 18.3). Таким образом, мы могли бы использовать mkstemp () следующим образом:

int fd;
char template[] = "/tmp/somestringXXXXXX";
fd = mkstemp(template);
if (fd == -1)
    errExit("mkstemp");
    printf("Generated filename was: %s\n", template);
    unlink(template);
    /* Name disappears immediately, but the file
    is removed only after close() */
    /* Use file I/O system calls - read(), write(), and so on */
if (close(fd) == -1)
    errExit("close");
Другие вопросы по тегам