临时文件

2014-07-29 05:19:04   最后更新: 2014-07-29 05:35:05   访问数量:495




ISO C标准IO库提供了两个函数以帮助创建临时文件:

1、tmpnam

char *tmpnam(char *sptr);

 

返回指向唯一路径名的指针

sptr可以是NULL或者一个栈地址。当sptr为NULL时,返回一个内部静态内存地址(保存了临时文件名),当下一次以NULL调用函数的时候,该内存会被修改,这意味着如果要多次调用此函数,而且想保存路径名,要保存该缓冲区内的内容而不仅仅是指针的副本。栈地址必须至少有L_tmpnam字节。ptr作为函数值返回

 

2、tmpfile

FILE *tmpfile(void);

 

若调用成功返回文件指针,调用失败返回NULL

 

创建一个临时的二进制文件(类似wb+)

在该文件或程序结束时,系统会自动删除临时文件

 

1、tempnam

char * tempnam (const char *directory, const char *prefix);

 

返回指向唯一路径名指针

 

依次执行下列四个判断,直到判断结果为真,则以此规则为目录:

  1. 如果定义了环境变量TMPDIR,则使用其值作为目录。
  2. 如果参数directory为非NULL并且存在,则使用其值作为目录
  3. 将<stdio.h>中的字符串p_tmpdir用作目录
  4. 将本地目录(通常是/tmp)作为目录

如果prefix非空,则将其用作文件名头几个字符(最多5个)

该函数用malloc函数分配动态存储区存放路径名,当不再使用此路径时可以释放此存储区

 

2、mkstemp

int mkstemp(char *temp_file);

 

调用成功返回文件描述符,出错返回-1

 

mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。

temp_file作为唯一的参数存储一个路径名,并且最后的6个字符设置为XXXXXX,当调用成功后,该函数用临时文件的名字替换掉XXXXXX,以创建唯一的路径名,并且将新的路径名存储在temp_file中作为返回。

与tmpfile不同的是,mkstemp创建的临时文件不会被自动删除,如果要删除,我们需要自行unlink它。

 

  • 例:
#include<stdio.h> #include<stdlib.h> int main(void) { int fd; char temp_file[]="tmp_XXXXXX"; /*Creat a temp file.*/ if((fd=mkstemp(temp_file))==-1) { printf("Creat temp file faile./n"); exit(1); } /*Unlink the temp file.*/ unlink(temp_file); /*Then you can read or write the temp file.*/ //ADD YOUR CODE; /*Close temp file*/ close(fd); }

 

 

unlink函数使文件引用数减一,当引用数为零时,操作系统就删除文件。但若有进程已经打开文件,则只有最后一个引用该文件的文件描述符关闭,该文件才会被删除,因此在使用临时文件时,打开文件后立刻执行unlink,这样可以保证即使程序在此后意外退出,临时文件依然会被删除,但在临时文件的使用中不会受到任何影响

 

  • 注意

tmpnam 和 tempnam 两个函数不是原子操作,在返回路径名和应用程序使用这个路径名创建文件之间有一个时间窗口,在这个时间内可能会有另一个进程创建同名文件,而 tmpfile 和 mkstemp 两个函数没有这个问题

 






读书笔记      技术帖      unix      c语言      龙潭书斋      apue      unix环境高级编程      linuxtmpnam      tmpfile      tempnam      mkstemp     


京ICP备15018585号