Cómo comprobar si dos nombres de archivo apuntan al mismo archivo físico

Tengo un progtwig que acepta dos nombres de archivo como argumentos: lee el primer archivo para crear el segundo. ¿Cómo puedo asegurarme de que el progtwig no sobrescriba el primer archivo?

Restricciones:

  • El método debe seguir funcionando cuando el sistema de archivos admite enlaces (suaves o duros).
  • Los permisos de los archivos son fijos y solo se requiere que el primer archivo sea legible y el segundo que se pueda escribir.
  • Preferiblemente debería ser neutral para la plataforma (aunque Linux es el objective principal)

En Linux, abra ambos archivos y use fstat para verificar si st_ino (edit 🙂 y st_dev son iguales. open seguirá los enlaces simbólicos. No uses stat directamente, para prevenir condiciones de carrera.

La mejor opción es no usar los nombres de archivo como identidades. En su lugar, cuando abra el archivo para leerlo, bloquéelo, utilizando cualquier mecanismo que admita su sistema operativo. Cuando también abra el archivo para escribir, también bloquéelo; si el locking falla, informe un error.

Si es posible, abra el primer archivo de solo lectura, ( O_RDONLY ) en LINUX. Luego, si intenta abrirlo de nuevo para escribir en él, obtendrá un error.

Puede usar stat para obtener el estado del archivo y verificar si los números de inodo son los mismos.

¿Tal vez podrías usar la función system () para invocar algunos comandos de shell?

En bash, simplemente llamaría:

 stat -c %i filename 

Esto muestra el número de inodo de un archivo. Puede comparar dos archivos de esta manera y si sus inodos son idénticos, significa que son enlaces duros. La siguiente convocatoria:

 stat -c %N filename 

mostrará el nombre del archivo y, si se trata de un enlace simbólico, también imprimirá el nombre del archivo al que se vincula. Imprime solo un nombre, incluso si el archivo al que apunta tiene enlaces duros, por lo que verificar el enlace simbólico requeriría comparar los números de inodo para el segundo archivo y el archivo al que se vincula el enlace simbólico para asegurarse.

Podría redirigir la salida de estadísticas a un archivo de texto y luego analizar el archivo en su progtwig.