代码之家  ›  专栏  ›  技术社区  ›  andrewrk

如何获取要在Linux中使用的tempfile的文件名?

  •  9
  • andrewrk  · 技术社区  · 16 年前

    假设我正在用C创建一个需要使用tempfile的程序。在/tmp中创建临时tempfile可能不是一个好主意。是否有函数或操作系统调用为我提供一个临时文件名,以便我可以开始从中写入和读取?

    6 回复  |  直到 16 年前
        1
  •  20
  •   gavrie    16 年前

    你可以使用 mkstemp(3) 为此目的发挥作用。另一种选择是 tmpfile(3) 功能。 您选择哪一个取决于您是否希望文件作为C库文件流打开(哪个 tmpfile 或直接文件描述符( mkstemp )这个 打开临时文件 函数还可以在程序完成时自动删除文件。

    使用这些函数的好处是,它们避免了在确定唯一文件名和创建文件之间出现竞争条件,这样两个程序就不会试图同时创建相同的文件,例如。

    有关更多详细信息,请参阅这两个函数的手册页。

        2
  •  5
  •   Iharob Al Asimi    10 年前

    问题是如何生成临时文件 名称 . mkstemp和tmpfile都不向调用者提供名称,它们分别返回文件描述符或文件句柄。

        3
  •  3
  •   Konrad Rudolph    16 年前

    @加雷斯姆:

    我相信你要找的函数叫做tmpnam。

    你绝对应该 使用 tmpnam . 它遇到了我在回答中提到的竞争条件问题:在确定名称和打开名称之间,另一个程序可能会创建文件或指向它的符号链接,这是一个巨大的安全漏洞。

    这个 TMPNA 手册页特别指出不要使用它,而是要使用 mkstemp tmpfile 相反。

        4
  •  2
  •   DMC    16 年前

    当然:伙计。

    手册页有示例用法。

        5
  •  1
  •   Frep D-Oronge    16 年前

    不确定C库中的任何内容,但可以在shell中使用 mktemp .

        6
  •  0
  •   Cristiano Pereira    8 年前

    您应该使用mkstemp(),因为这是推荐的函数,但它会返回一个文件描述符,所以一旦有了该描述符,就可以得到它的名称:

    int fd;
    fd = mkstemp("hdrXXXXXX);
    /* Read out the link to our file descriptor. */
    sprintf(path, "/proc/self/fd/%d", fd);
    memset(result, 0, sizeof(result));
    readlink(path, result, sizeof(result)-1);
    
    /* Print the result. */
    printf("%s\n", result);