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

When a file created with mkstemp() is deleted?

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

没有,当用tmpfile()创建文件时,其目录条目(在临时目录中)在创建后被删除,因此只有open引用的文件描述符导致到文件索引节点(在 /proc/<pid>/fd 目录中);调用 close(fd) 后,将不再有对该文件的引用。

使用 mkstemp() 您必须在创建后立即使用 unlink() 手动完成。

will Linux delete this file after close(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).

必要的headers:

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

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");