05.12 用 tmpfile 创建临时文件
在 Linux 上推荐使用的创建临时文件的方法只有 mkstemp
和 tmpfile
。前者是系统调用,用起来更复杂一点,后者是 C 标准库函数。其他的函数多多少少有自己的问题。
tmpfile
不再需要我们提供字符数组来存储文件名,返回的是 FILE*
而不是 fd。此外还在刚创建文件之后就使用了 unlink
来删除文件,这样就只有当前进程可以访问到这个文件了(除非 fork
)。
#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main() {
// 创建文件,记得关闭。
FILE *fp;
assert((fp = tmpfile()) != NULL);
// 查询文件路径并打印。
char path[128];
char link_path[128];
int fd = fileno(fp);
assert(fd != -1);
sprintf(link_path, "/proc/self/fd/%d", fd);
assert(readlink(link_path, path, sizeof(path)) != -1);
printf("tmpfile: %s\n", path);
fprintf(fp, "write something\n");
fflush(fp);
// 在这里停顿。由于已经 unlink 了这个文件,文件系统上看不到它。
getchar();
fclose(fp);
}
运行结果:
(py310) xxx /data/apue $ /data/apue/build/apue
tmpfile: /tmp/#943520 (deleted)
多出来的一行是因为 getchar()
有停顿,需要键入换行符。在停顿的时候去看 /tmp 目录,根本找不到临时文件。