我有一个程序,它调用mkstemp(),用返回的fd写一些东西,然后关闭fd。我希望文件保持不变,直到我自己删除它!比如rm命令之类的。我的问题是: Linux会在关闭(Fd)之后删除这个文件吗?
发布于 2017-10-31 10:46:30
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>发布于 2015-09-07 20:40:26
不,当使用tmpfile()创建文件时,它的目录条目(在临时目录中)在创建之后会被删除,因此只有open引用的文件描述符会导致文件inode(在/proc/<pid>/fd目录中);一旦调用了close(fd),就没有对文件的引用了。
使用mkstemp(),您必须在创建之后立即使用unlink()手动完成此操作。
发布于 2020-11-15 14:40:51
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");https://stackoverflow.com/questions/32445579
复制相似问题