varios - ¿Cómo se obtiene el nombre de archivo de un archivo temporal para usar en Linux?
renombrar archivo linux (6)
@garethm:
Creo que la función que estás buscando se llama tmpnam.
Definitivamente no tmpnam
usar tmpnam
. Sufre del problema de condición de carrera que mencioné en mi respuesta: entre determinar el nombre y abrirlo, otro programa puede crear el archivo o un enlace simbólico a él, que es un gran agujero de seguridad.
La página de manual de tmpnam
dice específicamente que no se use, sino que se use mkstemp
o tmpfile
.
Digamos que estoy creando un programa en C que necesita usar un archivo temporal. Crear un archivo de temp. Ad hoc en / tmp probablemente no sea una buena idea. ¿Hay una función o una llamada al sistema operativo que me proporcione un nombre de archivo temporal para que pueda empezar a escribir y leer desde él?
Absolutamente: hombre mkstemp.
La página man tiene uso de ejemplo.
No estoy seguro de nada en una biblioteca C, pero puede hacerlo en el shell con mktemp .
Puede usar la función mkstemp(3)
para este propósito. Otra alternativa es la función tmpfile(3)
. Cuál de ellos elija depende de si desea que el archivo se abra como una secuencia de archivo de biblioteca C (que tmpfile
hace), o un descriptor de archivo directo ( mkstemp
). La función tmpfile
también elimina el archivo automáticamente cuando finaliza el programa.
La ventaja de usar estas funciones es que evitan las condiciones de carrera entre la determinación del nombre de archivo único y la creación del archivo, de modo que dos programas no intentarán crear el mismo archivo al mismo tiempo, por ejemplo.
Vea las páginas man para ambas funciones para más detalles.
La pregunta es cómo generar un nombre de archivo temporal. Ni mkstemp ni tmpfile proporcionan un nombre a la persona que llama, devuelven un descriptor de archivo o manejador de archivo, respectivamente.
Debe usar mkstemp () ya que esta es la función recomendada, pero devuelve un descriptor de archivo, por lo que una vez que tenga el descriptor, obtenga su nombre:
int fd;
fd = mkstemp("hdrXXXXXX);
/* Read out the link to our file descriptor. */
sprintf(path, "/proc/self/fd/%d", fd);
memset(result, 0, sizeof(result));
readlink(path, result, sizeof(result)-1);
/* Print the result. */
printf("%s/n", result);