Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

538
Vistas
¿Cómo funciona realmente mkstemp()?

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

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿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

  • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c verifique la entrada
  • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c#L229 obtener algunos datos aleatorios
  • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c#L241 repita para https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c #L211 número especificado de intentos
    • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c#L245 llenar XXXXXX con aleatorios
    • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c#L261 archivo abierto con O_CREAT | O_EXCL
      • https://github.com/lattera/glibc/blob/master/sysdeps/posix/tempname.c#L293 si el archivo está abierto regrese, si el error es desconocido regrese, si el archivo existe, repita

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 .

over 4 years ago · Santiago Trujillo Denunciar

0

(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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda