2008-08-27 12 views

Respuesta

20

Puede usar la función mkstemp(3) para este fin. 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), 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.

Consulte las páginas de manual para ambas funciones para obtener más detalles.

+0

mkstemp sólo devuelve un descriptor de archivo abierto en una nuevo archivo pero también puede obtener su nombre final porque mkstemp reemplaza los caracteres XXXXXX de la plantilla. – Angel

2

Absolutamente: man mkstemp.

La página man tiene un uso de ejemplo.

1

No estoy seguro acerca de nada en una lib de C, pero puede hacerlo en el shell con mktemp.

3

@garethm:

Creo que la función que está buscando se llama tmpnam.

definitivamente debe no uso 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, pero para usar mkstemp o tmpfile en su lugar.

5

La pregunta es cómo generar un archivo temporal nombre. Ni mkstemp ni tmpfile proporcionan un nombre a la persona que llama, devuelven un descriptor de archivo o manejador de archivo, respectivamente.

+0

Tiene razón, marca, la pregunta pide un nombre de archivo temporal. Pero la pregunta es incorrecta. El interlocutor no quiere realmente un nombre de archivo temporal, realmente quiere un archivo temporal. –

+1

Entonces la pregunta debería ser cambiada. –

+10

No es cierto: mkstemp * does * proporciona a la persona que llama un nombre, ya que modifica la plantilla que se le da. La persona que llama debe proporcionar una plantilla, pero esta es una cuestión relativamente simple de elegir un directorio temporal (por ejemplo, $ TMPDIR, P_tmpdir o "/ tmp") y un prefijo, seguido de seis X. –

0

Se debe utilizar la mkstemp() ya que esta es la función recomendada, pero devuelve un descriptor de archivo, por lo que una vez que tenga el descriptor de obtener 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); 
+0

Chekc this [URL] (http://stackoverflow.com/help) Será útil aumentar la calidad de su contenido –

Cuestiones relacionadas