有些程序需要创建一些临时文件,仅供其在运行期间使用,程序终止后就删除。GNU C 语言函数库为此而提供了一系列库函数。(之所以有“一系列”的库函数,部分原因是由于这些函数分别继承自各种 UNIX 实现。)本节将介绍其中的两个函数:mkstemp()和 tmpfile()
mkstemp()
AME
mkstemp, mkostemp, mkstemps, mkostemps - 创建一个唯一的临时文件
SYNOPSIS
#include <stdlib.h>
int mkstemp(char *template);
int mkostemp(char *template, int flags);
int mkstemps(char *template, int suffixlen);
int mkostemps(char *template, int suffixlen, int flags);
glibc的功能测试宏要求 (see feature_test_macros(7)):
mkstemp():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* Glibc versions <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
mkostemp(): _GNU_SOURCE
mkstemps():
/* Glibc since 2.19: */ _DEFAULT_SOURCE
|| /* Glibc versions <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
mkostemps(): _GNU_SOURCE
DESCRIPTION
mkstemp()函数从模板生成唯一的临时文件名,创建并打开文件,并返回该文件的打开文件描述符。
模板的最后六个字符必须为“ XXXXXX”,并用使文件名唯一的字符串替换。 由于将对其进行修改,
因此模板不能为字符串常量,而应声明为字符数组。
创建的文件具有权限0600,即,仅所有者拥有读写权限。 返回的文件描述符提供对文件的读写
访问。 使用open(2)O_EXCL标志打开文件,从而确保调用者是创建文件的进程。
mkostemp()函数类似于mkstemp(),不同之处在于可以在标志中指定以下位(与open(2)的含义
相同):O_APPEND,O_CLOEXEC和O_SYNC。 请注意,在创建文件时,mkostemp()在给open(2)的
flags参数中包含值O_RDWR,O_CREAT和O_EXCL。 在给mkostemp()的flags参数中包含这些值是
不必要的,并且在某些系统上会产生错误。
mkstemps()函数类似于mkstemp(),不同之处在于模板中的字符串包含后缀字符后缀。 因此,
模板的形式为prefixXXXXXXsuffix,并且字符串XXXXXX与mkstemp()一样被修改。
mkostemps()函数用于mkstemps(),mkostemp()函数用于mkstemp()。
RETURN VALUE
成功执行后,这些函数将返回临时文件的文件描述符。
如果出错,则返回-1,并正确设置errno。
基于调用者提供的模板,mkstemp()函数生成一个唯一文件名并打开该文件,返回一个用于IO调用的文件描述符
模板参数采用路径名形式,其中最后 6 个字符必须为 XXXXXX。这 6 个字符将被替换,以保证文件名的唯一性,且修改后的字符串将通过 template 参数传回。因为会对传入的 template参数进行修改,所以必须将其指定为字符数组,而非字符串常量。
文件拥有者对 mkstemp()函数建立的文件拥有读写权限(其他用户则没有任何操作权限),且打开文件时使用了 O_EXCL 标志,以保证调用者以独占方式访问文件
通常,打开临时文件后不久,程序就会使用unlink系统调用将其删除。
mkstemp()函数的实例代码如下:
int fd;
char tempName[] = "tmp/somethingXXXXXX";
fd = mkstemp(tempName);
if(fd == -1){
perror("mkstemp");
exit(EXIT_FAILURE);
}
printf("generate filename was: %s\n", tempName);
unlink(tempName);
.....使用tempName....
close(fd);
使用 tmpnam()、tempnam()和 mktemp()函数也能生成唯一的文件名。然而,由于这会导致应用程序出现安全漏洞,应当避免使用这些函数
tmpfile()
NAME
tmpfile - 创建一个临时文件
SYNOPSIS
#include <stdio.h>
FILE *tmpfile(void);
DESCRIPTION
tmpfile() 函数以二进制读/写(w + b)模式打开唯一的临时文件。
该文件在关闭或程序终止时将被自动删除。
RETURN VALUE
tmpfile()函数返回流描述符,如果无法生成唯一的文件名或无法打开
唯一的文件,则返回NULL。 在后一种情况下,将errno设置为指示错误。
NOTES
POSIX.1-2001指定:如果无法打开流,则可能将错误消息写入stdout。
该标准未指定tmpfile()将使用的目录。 glibc将尝试在<stdio.h>中
定义的路径前缀P_tmpdir,如果失败,则目录/tmp失败。
tmpfile()函数会创建一个名称唯一的临时文件,并以读写方式将其打开。(打开该文件时使用了 O_EXCL 标志,以防一个可能性极小的冲突,即另一个进程已经创建了一个同名文件。
tmpfile()函数执行成功,将返回一个文件流供 stdio 库函数使用。文件流关闭后将自动删除临时文件。为达到这一目的,tmpfile()函数会在打开文件后,从内部立即调用 unlink()来删除该文件名
(进程终止时会关闭所有打开的文件描述符,关闭文件就会删除这些临时文件由此可以推导出,进程退出时将自动删除临时文件)