如何在 Linux 平台上创建用于用 C++ 编写的临时文件?
Posted
技术标签:
【中文标题】如何在 Linux 平台上创建用于用 C++ 编写的临时文件?【英文标题】:How can I create a temporary file for writing in C++ on a Linux platform? 【发布时间】:2008-10-01 22:08:08 【问题描述】:在 C++ 中,在 Linux 上,我如何编写一个函数来返回一个临时文件名,然后我可以打开该文件名进行写入?
文件名应该尽可能唯一,这样使用相同函数的另一个进程就不会得到相同的名称。
【问题讨论】:
【参考方案1】:使用标准库“mktemp”函数之一:mktemp/mkstemp/mkstemps/mkdtemp。
编辑:普通 mktemp 可能不安全 - mkstemp 是首选。
【讨论】:
这些返回一个已经打开的文件句柄,它不与 C++ 的 IO 流混合。例如,如果您需要使用 std::wofstream 来写入这个新文件怎么办?【参考方案2】:tmpnam(),或者任何给你一个名字的东西都容易受到竞争条件的影响。使用为此目的设计的返回句柄的东西,例如 tmpfile():
#include <stdio.h>
FILE *tmpfile(void);
【讨论】:
【参考方案3】:GNU libc 手册讨论了各种可用的选项及其注意事项:
http://www.gnu.org/s/libc/manual/html_node/Temporary-Files.html
长话短说,正如其他人所提到的,应该只使用 mkstemp() 或 tmpfile()。
【讨论】:
【参考方案4】:man tmpfile
tmpfile() 函数打开一个唯一的二进制临时文件 读/写 (w+b) 模式。该文件将被自动删除时 已关闭或程序终止。ote
【讨论】:
【参考方案5】:mktemp 应该可以工作,否则可以从大量可用库中选择一个来生成 UUID。
【讨论】:
【参考方案6】:C 标准库中的tmpnam() 函数旨在解决这个问题。还有 tmpfile(),它返回一个打开的文件句柄(并在你关闭它时自动删除它)。
【讨论】:
不要使用 tmpnam()。从手册页:“永远不要使用这个函数。改用 mkstemp(3) 或 tmpfile(3)。” 糟糕。我没有注意问题的“在 Linux 上”部分。如果您不需要可移植性,mkstemp() 可能是正确的解决方案。【参考方案7】:您应该简单地检查您尝试写入的文件是否已经存在。 这是一个锁定问题。 文件也有所有者,所以如果你做对了,错误的进程将无法写入。
【讨论】:
以上是关于如何在 Linux 平台上创建用于用 C++ 编写的临时文件?的主要内容,如果未能解决你的问题,请参考以下文章
在 UNIX(Linux 首选)上学习 C++ 编程的好书? [关闭]