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