05.12 用 tmpfile 创建临时文件

在 Linux 上推荐使用的创建临时文件的方法只有 mkstemptmpfile。前者是系统调用,用起来更复杂一点,后者是 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 目录,根本找不到临时文件。