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