首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用mkstemp()创建的文件被删除时?

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

Stack Overflow用户
提问于 2015-09-07 20:22:57
回答 3查看 6.7K关注 0票数 7

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-31 10:46:30

Linux会在关闭(Fd)之后删除这个文件吗?

不是自动的。您需要手动调用文件上的unlink。如果您不需要按名称(即通过文件系统)访问文件,则可以在调用mkstemp之后立即执行此操作--一旦描述符关闭,它将被删除。

或者,如果您需要通过名称将文件传递到代码(或进程)的另一部分,那么先不要调用unlink

下面是一个工作流示例:

代码语言:javascript
复制
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)

必要的标题:

代码语言:javascript
复制
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
票数 12
EN

Stack Overflow用户

发布于 2015-09-07 20:40:26

不,当使用tmpfile()创建文件时,它的目录条目(在临时目录中)在创建之后会被删除,因此只有open引用的文件描述符会导致文件inode(在/proc/<pid>/fd目录中);一旦调用了close(fd),就没有对文件的引用了。

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

票数 0
EN

Stack Overflow用户

发布于 2020-11-15 14:40:51

Linux编程接口书给出了这个问题的最佳答案。请参阅下面代码中的注释。

通常,使用unlink()系统调用(第18.3节),临时文件在打开后不久就会被取消链接(删除)。因此,我们可以按以下方式使用mkstemp():

代码语言:javascript
复制
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");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32445579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档