GNU/Linux >> Tutoriales Linux >  >> Linux

¿Rename() es atómico?

Esta es una respuesta muy tardía, pero... sí rename() es atómico pero no en el sentido de su pregunta. En Linux, rename(2) dice:

Sin embargo, al sobrescribir probablemente aparecerá una ventana en la que tanto la ruta antigua como la ruta nueva se refieren al archivo que se está renombrando.

Pero rename() sigue siendo atómico en un sentido muy importante:si lo usa para sobrescribir un archivo, terminará con la versión anterior o la nueva y nada más.

[actualización: pero como @jonas-wielicki señala en los comentarios, debe asegurarse de que el archivo al que está cambiando el nombre tenga contenido actualizado, usando fsync() y amigos.]

Si newpath ya existe, se reemplazará atómicamente (sujeto a algunas condiciones; consulte ERRORES a continuación), de modo que no haya ningún punto en el que otro proceso que intente acceder a newpath encuentre que falta.

Si ve ERRORES, encontrará que el cambio de nombre puede fallar, pero nunca romperá la atomicidad.

Todo esto es de la página de manual de Linux. Lo que no sé es si haces un rename() en un sistema de archivos de red donde el servidor ejecuta un sistema operativo diferente. ¿Tiene el cliente alguna esperanza en el infierno de garantizar la atomicidad entonces? Lo dudo.


Sí y no.

rename() es atómico asumiendo que el sistema operativo no falla. No puede ser dividido por ninguna otra operación de sistema de archivos.

Si el sistema falla, es posible que vea una operación ln() en su lugar.

También tenga en cuenta que cuando opera en un sistema de archivos de red, puede obtener ENOENT cuando la operación se realizó correctamente. El sistema de archivos local no puede hacerte eso.


No estoy seguro de que la parte "básicamente" de su pregunta sea válida. A menos que tenga algún tipo de sincronización entre los dos, no importa cuán atómico sea el cambio de nombre. Si la copia del directorio llega antes del cambio de nombre, tendrá el archivo 1 en ambos lugares.

No estoy seguro de si se refería a subprocesos o procesos, pero si existen mecanismos de bloqueo para ambos, los bloqueos de subprocesos son, con mucho, los más simples porque no tienen que cruzar los límites de los procesos.


Linux
  1. Cómo cambiar el nombre de un directorio en Linux

  2. ¿Está Mv Atomic en el Fs?

  3. ¿Cómo cambiar el nombre de un usuario de forma segura?

  4. Comando de cambio de nombre de Linux

  5. ¿Cómo usar variables atómicas en C?

Cómo cambiar el nombre de una columna en MySQL

Cómo cambiar el nombre de los archivos en Linux

Cómo cambiar el nombre de los directorios en Linux

Cómo cambiar el nombre de un archivo (s) en Linux

Mover un archivo en Linux en C

Linux cambia el nombre de los archivos a mayúsculas