Unix/Linux编程:创建临时文件----mkstemp()和 tmpfile()

有些程序需要创建一些临时文件,仅供其在运行期间使用,程序终止后就删除。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()来删除该文件名

(进程终止时会关闭所有打开的文件描述符,关闭文件就会删除这些临时文件由此可以推导出,进程退出时将自动删除临时文件)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值