Lectura y escritura de archivos temporales de C++ Linux

 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

  1. Programas Es posible que se estén ejecutando varios procesos al mismo tiempo, y deben usar diferentes archivos temporales.
  2. Tenga cuidado al configurar los atributos de los archivos, los usuarios no autorizados no deberían tener acceso a los archivos temporales.
  3. 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43550173/article/details/113783304
Recomendado
Clasificación