【发布时间】:2010-09-06 23:26:48
【问题描述】:
假设我正在用 C 语言创建一个需要使用临时文件的程序。在 /tmp 中创建临时临时文件可能不是一个好主意。是否有函数或操作系统调用为我提供临时文件名,以便我可以开始写入和读取?
【问题讨论】:
假设我正在用 C 语言创建一个需要使用临时文件的程序。在 /tmp 中创建临时临时文件可能不是一个好主意。是否有函数或操作系统调用为我提供临时文件名,以便我可以开始写入和读取?
【问题讨论】:
通常不需要实际创建一个命名文件;而是使用文件描述符路径,
FILE *tmp=tmpfile();
char path[PATH_MAX+1]={0};
sprintf(path, "/dev/fd/%d", fileno(tmp));
printf("%s\n", path);
【讨论】:
你应该使用 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);
【讨论】:
/proc/self - 改为使用 /dev/fd/%d ,那么它将与您自己进程中的线程和不同进程一起使用
问题是如何生成一个临时文件name。 mkstemp 和 tmpfile 都没有为调用者提供名称,它们分别返回文件描述符或文件句柄。
【讨论】:
@garethm:
我相信您要查找的函数称为 tmpnam。
你绝对应该不使用tmpnam。它存在我在回答中提到的竞争条件问题:在确定名称和打开它之间,另一个程序可能会创建文件或指向它的符号链接,这是一个巨大的安全漏洞。
tmpnam 手册页明确表示不要使用它,而是使用 mkstemp 或 tmpfile。
【讨论】:
不确定 C 库中的任何内容,但您可以在 shell 中使用 mktemp 执行此操作。
【讨论】:
绝对:man mkstemp。
手册页有示例用法。
【讨论】:
您可以为此目的使用mkstemp(3) 函数。另一种选择是tmpfile(3) 函数。
您选择其中的哪一个取决于您是希望将文件作为 C 库文件流(tmpfile 这样做)还是直接文件描述符(mkstemp)打开。 tmpfile 函数还会在您程序完成时自动删除文件。
使用这些函数的优点是它们避免了确定唯一文件名和创建文件之间的竞争条件 - 例如,两个程序不会尝试同时创建同一个文件。
有关更多详细信息,请参阅这两个函数的手册页。
【讨论】: