Programación

Diferencia entre enlace duro y simbólico

Posteado el 26 de enero de 2023 por admin

<strong>Diferencia entre enlace duro y simbólico</strong>

La diferencia fundamental entre un enlace duro y un enlace simbólico es que el enlace duro es una referencia directa al archivo, en el que el enlace simbólico es una referencia por nombre, lo que implica que muestra un archivo por nombre de archivo.

El enlace fijo vincula archivos y directorios en el mismo sistema de archivos, sin embargo, el enlace simbólico puede cruzar los límites del sistema de archivos.

Antes de entender los enlaces, primero debemos entender el inodo. el inodo es una composición de datos formada por metadatos sobre el archivo, como la fecha de construcción del archivo, las autorizaciones del archivo, el propietario del archivo y más.

Definición de enlace duro

Los enlaces duros vinculan directamente dos archivos en el mismo sistema de archivos y, para su identificación, utilizan el número de inodo del documento. Los enlaces duros son imposibles de realizar en los directorios (ya que apuntan al inodo). Una vez que se usa el comando «ln» para crear un vínculo físico, crea otro archivo en la línea de comando que se puede usar para hacer referencia al archivo original. Tanto el archivo original como el creado tienen el mismo inodo y contenido; por tanto, tendrán las mismas funciones y el mismo titular.

La eliminación del archivo original no tiene efecto en el archivo vinculado y seguirá siendo un archivo vinculado. El inodo tiene un contador, para calcular el número de enlaces físicos a sí mismo. Una vez que el contador sugiere un costo 0, el inodo se vacía. Siempre que realice cambios en el vínculo físico, se imitará en el archivo original.

ln file_1 file_2

Definición de enlace simbólico

Los enlaces simbólicos suelen ser una opción de ruta (o un alias) al archivo original; Estos también se identifican como enlace suave. Incluye el nombre del “archivo de destino” del enlace, que especifica que se trata de un enlace simbólico. Una vez que se accede a un archivo, el enlace temporal lo redirige al archivo de destino a través de la ruta escrita en el tema del enlace simbólico.

Estos son muy útiles en la situación del sistema operativo Windows donde el enlace simbólico se comporta como accesos directos. Crear y eliminar enlaces no daña el archivo original. Si se elimina el archivo de destino, se suspenderá el enlace simbólico, lo que supone que no muestra ninguna parte y genera un mensaje de error una vez que se accede al archivo de destino. Los enlaces simbólicos no utilizan el número de inodo, a diferencia de los enlaces físicos. Una ruta absoluta o relativa puede ser parte de enlaces simbólicos.

Principales diferencias entre enlace duro y simbólico

Diferencias entre enlaces duros y enlaces simbólicos en el entorno GNU Linux usando los comandos echo, ln y ls.

-Un enlace duro es un nombre adicional del archivo original que hace referencia al inodo para ingresar al archivo de destino. Por otro lado, el enlace fácil es diferente del archivo original y es un alias del archivo original, sin embargo, no utiliza el inodo.

-Cuando se elimina un archivo original, el enlace simbólico ya no es válido, por lo que un enlace físico es válido incluso si se elimina el archivo de destino.

-En Linux, el comando utilizado para generar el enlace duro es «ln». sin embargo, el comando utilizado para un enlace simbólico es “ln -s”.

-El enlace duro tiene el mismo número de inodo diferente que el enlace simbólico, donde el archivo de destino y su enlace simbólico tienen un número de inodo diferente.

-Los enlaces duros permanecen restringidos a sus propias particiones, sin embargo, los enlaces simbólicos tienen la capacidad de comprender diferentes sistemas de archivos.

-El rendimiento del enlace duro es mejor que el del enlace simbólico en algunas ocasiones.

-Tanto la ruta relativa como la ruta absoluta quedan permitidas en Link simbólico. Por otro lado, la ruta relativa no está permitida en un enlace duro.

En conclusión, un enlace físico no requiere espacio adicional ni una resolución más rápida; sin embargo, los cambios realizados en un vínculo físico se reflejan en el archivo original. Por otro lado, el enlace simbólico requiere espacio adicional, pero cualquier cambio en el enlace no daña el documento original. Se permiten enlaces simbólicos para directorios en lugar de enlaces duros.

Blog 2

“Todo sobre Bibliotecas Estáticas en C”

¿Qué es una biblioteca?

Una biblioteca es una colección de piezas de código precompiladas llamadas funciones. La biblioteca contiene funciones comunes y juntas forman un paquete llamado — una biblioteca. Las funciones son bloques de código que se reutilizan a lo largo del programa. Usar las piezas de código nuevamente en un programa ahorra tiempo. Evita que el programador reescriba el código varias veces. Para los programadores, las bibliotecas proporcionan funciones reutilizables, estructuras de datos, clases, etc.

¿Por qué y cuándo utilizar las bibliotecas?:

Las bibliotecas brindan al usuario el beneficio de usar una variedad de archivos que se pueden reutilizar en diferentes programas. Por ejemplo, si íbamos a usar las mismas funciones en diferentes programas, simplemente la escribiremos una vez y la reutilizaremos en lugar de tener cientos de copias de la misma función, una en cada programa.

Las bibliotecas tienen archivos de objetos creados por el indicador gcc «-c» y terminan en «.o» por convención. Son el resultado de la salida del compilador y contienen definiciones de funciones en forma binaria.

-Vamos a sumergirnos en un poco de código fuente C:

En la parte superior, incluimos <stdio.h>, el encabezado de entrada y salida estándar, en el que se declara la función printf.

Los archivos de encabezado, como stdio.h, contienen declaraciones de funciones y definiciones de macros para compartir entre archivos de origen. Le dicen al compilador cómo llamar a alguna funcionalidad, sin saber cómo funciona la funcionalidad.

Las bibliotecas son donde se implementa la funcionalidad real porque contienen la definición de la función. Las bibliotecas tienen dos tipos:

  • Estático
  • Dinámica

¿Qué es una biblioteca estática?

La forma más sencilla de usar una función de biblioteca es tener los archivos de objeto de la biblioteca vinculados directamente a su ejecutable final, al igual que con los que ha compilado usted mismo.

Cuando se vincula de esta manera, la biblioteca se denomina biblioteca estática, porque la biblioteca permanecerá sin cambios a menos que se vuelva a compilar el programa. Esta es la forma más sencilla de usar una biblioteca, ya que el resultado final es un ejecutable simple sin dependencias.

Las bibliotecas estáticas, también llamadas bibliotecas de objetos (en relación a sus componentes o módulos incluyen ficheros de este tipo), son colecciones de ficheros objeto agrupados en un único fichero, normalmente con la extensión .lib o .a., acompañados de ficheros de cabecera, normalmente .h, que contienen las declaraciones de los objetos definidos en la biblioteca. Posteriormente, durante la fase de enlace, el enlazador incluye en el ejecutable los módulos correspondientes a las funciones y clases de biblioteca que se han utilizado en la aplicación. Como resultado, dichos módulos pasan a formar parte del ejecutable, como cualquier otra función o clase que se hubiera escrito en el cuerpo de la aplicación.

«Los archivos de objetos son productos de la fase de compilación y se componen principalmente de código de máquina, pero también contienen información que permite a los enlazadores ver qué funciones y objetos globales se encuentran dentro del programa».

Cómo funcionan las bibliotecas estáticas

Recuerde los cuatro pasos de la compilación.

  1. Preprocesamiento: elimina comentarios y trata con # directivas
  2. Compilación: el código preprocesado se convierte en código ensamblador
  3. Ensamblaje: el código se convierte en código de máquina (ceros y unos), también conocido como código objeto
  4. Vinculación: produce el ejecutable

En el Paso 4, la vinculación intenta resolver los símbolos a los que se hace referencia y ubicar en qué archivo de objeto están definidos los símbolos. El código objeto de su programa se copia en el ejecutable.

Si tenemos una biblioteca estática con archivos de objetos y un índice de símbolos definidos (frente a archivos de objetos en diferentes discos), el proceso de vinculación es más rápido. Nuestro programa también es más portátil porque no tenemos que depender de las bibliotecas particulares que están en el sistema.

Cómo crear bibliotecas estáticas

  1. Cree un archivo de encabezado con sus prototipos de funciones e incluya el archivo de encabezado en sus archivos fuente C.
  1. Compile sus archivos de código fuente C sin vincularlos usando gcc-cflag.

Este comando le dice al compilador que genere archivos de objetos para todos los archivos .c en el directorio actual. El indicador -c compila sus archivos fuente C pero no los vincula.

3. Cree una biblioteca estática (archivo) usando «ar» y «ranlib».

El comando para crear una biblioteca estática es ar, que significa «archivador». El comando ar no solo crea bibliotecas estáticas (que son básicamente archivos de almacenamiento). También puede enumerar los nombres de los archivos de objetos en la biblioteca y modificar los archivos .o contenidos en la biblioteca estática. Para crear una biblioteca estática, podemos usar un comando como este:

En este comando, el indicador r garantiza que los archivos más antiguos se actualizarán reemplazándolos con nuevos archivos de objetos. El indicador c significa que la biblioteca se creará si aún no existe. Finalmente, *.o es una operación comodín para incluir todos los archivos que terminan en .o en la biblioteca estática.

Cada vez que se agregan archivos a una biblioteca, incluida la creación inicial de la biblioteca, la biblioteca debe indexarse, lo que se hace con el comando ranlib. ranlib crea un encabezado en la biblioteca con los símbolos del contenido del archivo del objeto. Esto ayuda al compilador a hacer referencia rápidamente a los símbolos. Una biblioteca grande puede tener miles de símbolos, lo que significa que un índice puede acelerar significativamente la búsqueda de referencias.

$ ranlib libholberton.a

Este paso puede o no ser necesario dependiendo de su sistema informático o su archivador (no es necesario con ar).

Si queremos ver el contenido de nuestra biblioteca, podemos usar la opción ar -t.

ar -t libholberton.a

También podemos ver los símbolos en nuestra biblioteca, usando el comando nm, que enumera el valor de símbolo de cada símbolo, el tipo de símbolo y el nombre de símbolo de los archivos de objetos.

Uso de bibliotecas estáticas

El objetivo de crear una biblioteca estática es usarla con otros programas. Si su biblioteca está en un directorio estándar, puede compilar su código de la siguiente manera:

En el comando anterior, vale la pena señalar que su código fuente, test_code.c en este caso, debe aparecer antes del indicador -l. La expresión -l combinada con holberton le dice al compilador que busque un archivo llamado libholberton.a. Por eso es importante usar el formato estándar para nombrar que describí anteriormente. Por ejemplo, si test_code.c fuera el siguiente:

Escribir y ejecutar gcc test_code.c -lholberton -o test_code generaría un archivo ejecutable llamado test_code.

Para lograr esto, el compilador busca en la biblioteca que se especifica con el indicador -l el código objeto de la función _puts. Ejecutar test_code así: ./test_code nos daría el siguiente resultado: ¡Hola mundo!.

Ahora que sabe cómo crear y usar bibliotecas estáticas, ¡espero que se divierta codificando!

Blog 3:

Cree su propia biblioteca estática de C en dos sencillos pasos

Al programar en C, las bibliotecas son una herramienta conveniente que ayuda a ahorrar tiempo y espacio en el disco. Por lo tanto, cualquier aspirante a programador, como yo, puede beneficiarse de una guía simplificada (y espero que no simplista) sobre ese tema, que es lo que pretendo proporcionar en este artículo.

Por lo general, al compilar un script que llama a una función de otro script, usamos un archivo de encabezado (el que tiene la extensión «.h») que funciona como intermediario, lo que permite la conexión (en la fase de enlace del proceso de compilación ) de ambos scripts para ejecutarse correctamente. Cuando compilamos el script que usa una función de otro script usando el comando gcc, debemos incluir los nombres de todos los scripts cuyas funciones se están llamando. Sin embargo, esto plantea el problema de que si hay demasiados scripts auxiliares para mencionar, escribir el comando de compilación se convertirá en un proceso engorroso.

Podemos eludir fácilmente esta situación mediante el uso de una biblioteca estática.

1. Compilar los objetos

El primer paso es compilar los scripts individuales en archivos de objetos, sin vincularlos. En este caso, copiamos todos los scripts que queremos incluir en nuestra biblioteca en una nueva carpeta, donde ejecutaremos el siguiente comando.

-c: compilar y ensamblar sin vincular

-Muro: habilita advertencias sobre construcciones cuestionables en el código

-Werror: convierte todas las advertencias en errores

-Wextra: habilita banderas adicionales que no fueron habilitadas por -Wall

2. Generar la biblioteca

Y luego, usamos todos los archivos de objetos recién generados para crear la biblioteca (con extensión “.a”). En este caso, estamos bautizando nuestra biblioteca como «libgiggity.a».

-r: reemplaza los objetos existentes con los nuevos, o inserta los nuevos si no se encuentran otras copias

-c: crear biblioteca si no existe

-s: escribe un índice de objeto en el archivo o actualiza uno existente

Una forma alternativa de generar la biblioteca sería usando los comandos ar y ranlib, así:

Aquí se usa el comando ranlib para indexar la biblioteca, lo que en el primer caso se hace agregando la bandera -s.

Uso

Entonces, ahora que tenemos nuestra biblioteca estática, podemos usarla en el proceso de compilación, así:

En este caso estamos compilando el archivo llamado “main.c”, que llama a funciones de la biblioteca “libgiggity.a”. El resultado será un archivo ejecutable llamado «principal».

-L: especificar la ruta donde se encuentra la biblioteca

-l: especifica el nombre de la biblioteca (sin el prefijo “lib” ni el sufijo “.a”)

-o: especifica el nombre del archivo de salida

***

Et voila! Ahora tenemos nuestra propia librería, la cual puede ser convenientemente utilizada en la compilación de cualquier archivo que llame a cualquiera de las funciones incluidas en la librería.

Recibe los últimos artículos directamente en tu bandeja de entrada.

Suscríbete a nuestro Newsletter