Estoy confundido con respecto al proceso de trabajo de la función mkstemp() .
En la página de man de la función mkstemp , se dice que la función genera un nombre único y crea un archivo con ese nombre.
Creo que existe la posibilidad de que cuando mkstemp() ese nombre de archivo en el directorio y lo encuentre único antes de crear ese archivo, otro programa puede crear el archivo con exactamente el mismo nombre (aunque las posibilidades son muy bajas, pero es posible teóricamente). Aunque luego no podrá crear el archivo ya que usa el indicador O_EXCL . Entonces, debe buscar nuevamente un nuevo nombre de archivo y crearlo. ¿Es este el proceso real de cómo funciona mkstemp() ?
Entonces, creo que verificar el nombre del archivo y crear realmente el archivo, ambos no lo procesan de forma atómica. (Puedo estar equivocado)
Usando un sistema POSIX
¿Cómo funciona realmente mkstemp()?
El código fuente es la descripción literal de un algoritmo. Tome una implementación e inspecciónela.
https://github.com/lattera/glibc/blob/master/misc/mkstemp.c -> https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c
XXXXXX con aleatoriosO_CREAT | O_EXCL Entonces no hay "comprobación", el archivo se abre con O_CREAT | O_EXCL desde el principio, por lo que la creación y la verificación se realizan juntas. Consulte https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html para obtener una explicación de los indicadores open .
(aunque las posibilidades son muy bajas, pero es posible teóricamente)
No, no es posible (incluso teóricamente) ya que la llamada al sistema open() () que usa mkstemp() para crear el archivo garantiza que dos procesos no pueden crear el mismo archivo con O_CREAT y O_EXCL simultáneamente. Cuando el kernel crea el archivo, el inodo del directorio se bloquea (por lo tanto, no se permite la creación de ningún otro archivo en ese directorio al mismo tiempo), y eso garantiza que los dos open() se serializarán (uno primero, o el otro, pero no ambos al mismo tiempo) Esto significa que cuando el segundo proceso tiene la oportunidad de crear el archivo, la llamada open() falla porque el archivo ya ha sido creado por el otro proceso. Para minimizar este escenario, la función normalmente usa el pid del proceso como parte del nombre, por lo que dos procesos al mismo tiempo no pueden generar el mismo nombre de archivo porque tienen diferentes ID de proceso) mkstemp() volvería a intentar la llamada al sistema con probablemente un nombre diferente, o simplemente fallar.