一些程序在运行的过程中会产生大量的临时文件,如在下载和安装’卸载软件、打开电子邮件和即时消息程序中的文件或传输文件时会创建临时文件。
使用临时文件注意事项
- 程序多个进程可能同时运行,他们应该使用不同的临时文件。
- 小心设置文件属性,未授权的用户不应具有临时文件的访问权限。
- 临时文件的生成应该外部不可预测,否则系统容易收到攻击。
临时文件相关函数介绍
mkstemp()
Linux中临时文件通过 mkstemp() 函数创建,该函数只有一个参数:char* template。
需要注意的是:这个字符串要以"XXXXXX"为结尾。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。
函数的返回值是文件描述符,如果执行失败则返回-1。
unlink()
临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。
由于mkstemp函数创建的临时文件不能自动删除,所以执行完 mkstemp函数后要调用unlink函数 ,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
代码实现
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
using namespace std;
int WriteToTempFile(char* buff, size_t length)
{
//创建临时文件
char file_name[] = "/tmp/temp.file.XXXXXX";
int fd = mkstemp(file_name);
//取消文件连接 不显示该临时文件
//关闭文件描述符后 临时文件会被删除
unlink(file_name);
write(fd, &length, sizeof(length));
write(fd, buff, length);
//返回文件描述符
return fd;
}
char* ReadFromTempFile(int fd, size_t* length)
{
//定位文件开头
lseek(fd, 0, SEEK_SET);
read(fd, length, sizeof(size_t));
char* buff = new char[*length];
read(fd, buff, *length);
close(fd);
return buff;
}
int main ()
{
char buff[] = "test temporary file write and read";
int fd = WriteToTempFile(buff, strlen(buff));
size_t len = 0;
cout << endl;
char* result = ReadFromTempFile(fd, &len);
cout << result << endl;
cout << endl;
return 0;
}