¿Cómo puedo verificar si mv
es atómico en mi fs (ext4)?
El sistema operativo es Red Hat Enterprise Linux Server versión 6.8.
En general, ¿cómo puedo verificar esto? Miré a mi alrededor y no encontré si mi sistema operativo es POSIX estándar.
Respuesta aceptada:
Curiosamente, parece que la respuesta puede ser:"Depende".
Para ser claros, mv
se especifica para
El mv
La utilidad realizará acciones equivalentes a rename()
función
La especificación de la función de cambio de nombre establece:
Este rename()
La función es equivalente para archivos regulares a la
definida por el estándar ISO C. Su inclusión aquí expande esa definición
para incluir acciones en directorios y especifica el comportamiento
cuando el nuevo parámetro nombra un archivo que ya existe. Esa
especificación requiere que la acción de la función sea atómica.
Pero la última especificación ISO C para rename()
estados:
7.21.4.2 El rename
función
Sinopsis
#include <stdio.h>
int rename(const char *old, const char *new);
Descripción
El rename
La función hace que el archivo cuyo nombre sea la cadena a la que apunta old
a partir de ahora conocido por el nombre
dado por la cadena a la que apunta new
. El archivo llamado old
ya no
es accesible con ese nombre. Si un archivo nombrado por la cadena apuntada
por new
existe antes de la llamada a rename
función, el comportamiento
está definido por la implementación.
Devoluciones
El rename
la función devuelve cero si la operación tiene éxito, distinto de cero si falla, en cuyo caso, si el archivo existió
anteriormente, todavía se conoce por su nombre original.
Sorprendentemente, tenga en cuenta que no hay un requisito explícito para la atomicidad. Es posible que se requiera en otro lugar en el último estándar C disponible públicamente, pero no he podido encontrarlo. Si alguien puede encontrar tal requisito, las ediciones y los comentarios son más que bienvenidos.
Según la página del manual de Linux:
Si newpath
ya existe, se reemplazará atómicamente, de modo que
no haya ningún punto en el que otro proceso intente acceder a newpath
encontrará que falta. Sin embargo, probablemente habrá una ventana
en la que tanto oldpath
y newpath
consulte el archivo que se
renombrará.
La página de manual de Linux reclama el reemplazo del archivo será atómico.
Pruebas y verificando Sin embargo, esa atomicidad puede ser muy difícil, si eso es lo lejos que necesita llegar. No tiene claro lo que quiere decir con el uso de "¿Cómo puedo verificar si mv es atómico?". ¿Quiere requisitos/especificaciones/documentación de que es atómico, o realmente necesita probar eso?
Relacionado:¿Obtener el PID de una ventana haciendo clic en él?
Tenga en cuenta también que lo anterior supone los dos nombres de archivos de operandos están en el mismo sistema de archivos. No puedo encontrar ninguna restricción estándar en el mv
utilidad para hacer cumplir eso.