Algunos programas generan una gran cantidad de archivos temporales mientras se ejecutan, como cuando se descargan e instalan programas de 'desinstalación', se abren archivos en programas de correo electrónico y mensajería instantánea o se transfieren archivos.
Notas sobre el uso de archivos temporales
- Programas Es posible que se estén ejecutando varios procesos al mismo tiempo, y deben usar diferentes archivos temporales.
- Tenga cuidado al configurar los atributos de los archivos, los usuarios no autorizados no deberían tener acceso a los archivos temporales.
- La generación de archivos temporales debe ser externamente impredecible, de lo contrario, el sistema es vulnerable a ataques.
Introducción a las funciones relacionadas con los archivos temporales
mkstemp()
Los archivos temporales en Linux son creados por la función mkstemp() , que tiene un solo parámetro: plantilla char*.
Cabe señalar que esta cadena debe terminar con "XXXXXX" . La función mkstemp reemplazará "XXXXXX" con una cadena generada aleatoriamente para garantizar la unicidad del nombre del archivo.
El valor de retorno de la función es el descriptor del archivo, o -1 si falla la ejecución.
desconectar()
Los archivos temporales deben eliminarse a tiempo después de su uso; de lo contrario, el directorio de archivos temporales se llenará de basura.
Dado que el archivo temporal creado por la función mkstemp no se puede eliminar automáticamente, se debe llamar a la función de desvincular después de ejecutar la función mkstemp La función de desvincular elimina la entrada de directorio del archivo, pero aún se puede acceder al archivo temporal a través del archivo descriptor hasta que el último proceso abierto cierra el operador de archivo, o el archivo temporal se elimina automática y completamente después de que el programa sale.
Código
#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;
}