当删除使用 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");
我有一个调用 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");