Когда файл, созданный с помощью 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");