使用mkstemp()创建的文件被删除?

时间:2015-09-07 20:22:58

标签: linux temporary-files

我有一个调用mkstemp()的程序,写入一些返回fd的东西,然后关闭fd。我希望文件保留,直到我自己删除它!使用rm命令等等。我的问题是:关闭(fd)后Linux会删除这个文件吗?

3 个答案:

答案 0 :(得分:5)

  

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>

答案 1 :(得分:1)

不,当使用tmpfile()创建文件时,其目录条目(在临时目录中)在创建后被删除,因此只有open引用的文件描述符导致文件inode(在/proc/<pid>/fd目录中);一旦你打电话给close(fd),就没有更多的文件参考了。

使用mkstemp(),您必须在创建后立即使用unlink()手动执行此操作。

答案 2 :(得分:0)

Linux编程接口书为该问题提供了最佳答案。关于下面代码中的注释。

通常,打开临时文件后,将使用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");