#include <stdio.h>
FILE *tmpfile(void);
tmpfile创建一个临时二进制文件(类型wb+),在关闭该文件或程序结束时将自动删除这种文件
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char name[100],line[100];
FILE *fp;
printf("%s\n", tmpnam(NULL));
tmpnam(name);
printf("%s\n", name);
if((fp = tmpfile()) == NULL)
{
perror("tmpfile error");
}
fputs("one line of output\n", fp);
rewind(fp);
if(fgets(line, sizeof(line), fp) == NULL)
{
perror("fgets error");
}
fputs(line, fp);
exit(0);
}
#include <stdlib.h>
int mkstemp(char *template);
mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。 mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非 空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证 了文件名的唯一性。 函数返回一个 文件描述符,如果执行失败返回-1。
在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完 mkstemp函数后要调用unlink函数,unlink函数
删除文件的目录入口,但临时文件还可以通过
文件描述符进行访问,直到最后一个打开的进程关 闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
int n;
int fd;
char line[100];
char temp_file[]="wyp-XXXXXX";
if((fd = mkstemp(temp_file)) == -1)
{
printf("creat temp file failed\n");
exit(1);
}
unlink(temp_file);
if((write(fd, "hello nihao\n", 13)) == -1)
printf("first write error\n");
if(lseek(fd, 0, SEEK_SET) == -1)
printf("lseek error\n");
if((n = read(fd, line, sizeof(line))) < 0)
printf("read error");
if(write(STDOUT_FILENO, line, n) != n)
printf("second write error\n");
close(fd);
return 0;
}
1,第二个write函数,第一个参数用stdout出错,用STDOUT_FILENO正确
2,如果不unlink的话,文件可以在当前目录下看到, 如果unlink的话,临时文件是看不到的
3,mkstemp函数推荐使用,相比较其他创建临时文件函数而言:使用tmpnam和tempnam的一个不足之处是:在返回唯一路径名和应用程序用该路径名创建文件之间有个时间窗口,在该时间窗口期间,另一个进程可能创建一个同名文件。tmpfile和mkstemp函数则不会产生此种问题,可以使用它们代替tmpnam和tempnam