¿Qué es un leak?

En este post vamos a estudiar uno de los conceptos más importantes que existen en el mundo de la programación. Un leak no es algo que exclusivamente debamos conocer y entender, sino algo que deberemos evitar a toda costa sin excepciones. Un leak no podrá aparecer en ningún momento durante la ejecución de nuestro programa.

Un leak, también conocido como fuga de memoria, hace referencia a la pérdida de información que utiliza, o ha utilizado, nuestro programa durante su ejecución. Es decir, es una pérdida de los recursos que nuestro programa necesita para poder ejecutarse correctamente. Esta pérdida es debida, principalmente, a dos factores:

  • El programa presenta fallos que provocan la pérdida de recursos necesarios. Debido a esto, en el momento de acceder a una información de la que no disponemos, por haberla perdido, el programa se comportará de manera inesperada. Esto puede acarrear desde pequeños fallos hasta catástrofes capaces de comprometer proyectos de gran importancia.
  • El programa ya no necesitará dichos recursos y decide deshacerse de ellos bruscamente, es decir, sin gestionar la forma en la que dichos recursos ya no van a ser utilizados. Un ejemplo de esto lo encontramos al utilizar memoria dinámica. Si reservamos una zona de la memoria, dicha zona estará referenciada por un puntero. Si por algún motivo el puntero pierde la referencia a dicha zona, no habrá manera de acceder a ella. Esto puede provocar que una gran parte de la memoria no pueda ser utilizada debido a que ha sido reservada pero no se puede acceder a ella.

Ambos casos tienen solución, si bien la solución puede llegar de forma tardía si el error producido ha causado grandes daños:

  • En el primer caso bastaría con identificar el origen del problema y solucionarlo. Parece algo bastante sencillo, pero en programas muy extensos encontrar un simple leak puede llevar horas de arduo trabajo. Por este motivo es importante asegurarse que, durante el desarrollo del código, no vamos arrastrando leaks. A su vez, una vez terminado el proyecto siempre es importante someterlo a pruebas en un entorno donde los fallos no produzcan daños.
  • El segundo caso se soluciona haciendo una buena gestión de los recursos utilizados. Si hemos reservado una zona de la memoria para trabajar sobre ella, deberemos liberar dicha zona en el momento en que sepamos que no vamos a utilizarla más. Este proceso es bastante similar al de cerrar un archivo que ha sido abierto para trabajar sobre él. Al final, lo importante es saber qué sucede con todos los recursos que utiliza el programa.
Memory Leaks
¿Cómo identificar un memory leak?

Hay lenguajes de programación donde simplemente no tendrás que preocuparte por la existencia de fugas de memoria ya que el propio intérprete del lenguaje se encargará de gestionar toda la memoria que no utilizas. Sin embargo, esto no sucede en lenguajes de programación como C o C++.

Si trabajas en un shell como bash podrás observar que hay un comando llamado leaks. Este comando busca en la memoria zonas que han sido reservadas pero que no son referenciadas. Así, tendrás información sobre si tu programa produce leaks o no. Sin duda, esto te solucionará horas y horas de debuggear tu programa.

Para seguir aprendiendo…

Wikipedia: Fuga de memoria

Megazona: Perdida de Memoria en ASP o Memory Leak en ASP

Linux Terminal: man leaks (manual sobre comando para detectar fugas de memoria)

Anuncio publicitario

¿Qué es un árbol binario?

Antes de aprender qué es un árbol binario, es importante que entiendas el concepto de estructura de datos y algunos de los tipos de estructuras de datos más simples con los que podemos trabajar: arrays, listas enlazadas, pilas, colas, etc. Una vez comprendidos estos conceptos podrás entender con mayor facilidad un nuevo tipo de estructura de datos fundamental pero más compleja de implementar: el árbol binario.

Un árbol binario es una estructura de datos que almacena los datos en forma de ramificaciones, como si de un árbol se tratara. Cada elemento de un árbol binario es un nodo. Este nodo podrá almacenar tanto un dato (que es el que queremos introducir) como dos referencias a dos nodos adicionales. Este nodo principal será considerado como nodo padre, mientras que los dos nodos referenciados por el nodo padre serán los nodos hijo. Del mismo modo, un nodo que no tenga referencia a otros nodos será conocido como nodo hoja.

Un nodo padre podrá tener un máximo de 2 nodos hijo, siendo este el motivo por el cual a esta estructura de datos se la conoce como árbol binario. De este árbol, debemos saber que el primer nodo de todos es el nodo raíz. A partir del nodo raíz surgen el resto de nodos, donde cada nuevo nodo hijo podrá ser padre de otros dos nodos.

Árbol Binario - Estructura de Datos

Entre las principales operaciones que podemos realizar con un árbol binario, destacan:

  • Insertar: insertar un elemento en el árbol.
  • Eliminar: suprimir un elemento del árbol.
  • Visitar: visualizar el contenido del árbol.

Junto con el conocimiento de estas operaciones básicas, también es muy importante conocer las aplicaciones prácticas que tiene un árbol binario. Algunos de los usos más frecuentes que se le da a esta estructura de datos son:

  • Tabla de rutas: para enlazar los diferentes routers que forman parte de una misma red.
  • Árbol de decisión: algoritmo de machine learning utilizado para tareas de clasificación.
  • Árbol de ordenación: utilizado para ordenar diferentes elementos en función de sus propiedades.

Para seguir aprendiendo…

HHMosquera: Árboles Binarios | Estructura de datos

UniOvi: ÁRBOLES. ÁRBOLES BINARIOS

RuneStone: Implementación de un árbol de búsqueda

¿Qué es una cola/queue?

Una cola, también conocida como queue, es una estructura de datos muy similar al stack. La principal diferencia con un stack se encuentra en el tipo de arquitectura utilizada. Mientras que una pila utiliza una arquitectura de tipo LIFO (Last In – First Out), una cola utiliza una arquitectura de tipo FIFO (First In – First Out).

Utilizar una arquitectura de tipo FIFO implica que el primer elemento en entrar en esta estructura de datos será el primero en salir. Es decir, los datos van a salir en el mismo orden en el que han sido introducidos. Así pues, para entender el funcionamiento de una cola, piensa en la cola que tienes que hacer para comprar en el supermercado. Una vez quieres pasar por caja te pones el último en la fila y hasta que todas las personas que están delante (por haber llegado antes) no han sido atendidas, tú no vas a ser atendido. Del mismo modo, una vez que un elemento ha sido introducido, hasta que todos los elementos que tenga delante no hayan sido sacados de la cola, este elemento no podrá ser expulsado.

Por otro lado, en cuanto a las operaciones que podemos realizar con una cola, son exactamente idénticas a las que podemos hacer con un stack. Al fin y al cabo, la única diferencia con una pila se encuentra en la manera que tienen de almacenar los datos: o bien se utiliza una arquitectura LIFO o bien se utiliza un arquitectura FIFO).

Cola/Queue

Por último, es importante señalar que existen diferentes tipos de colas. El uso de un tipo u otro dependerá de nuestro programa. No obstante, es importante destacar que una cola puede tener variantes mientras que un stack no, siempre se va a comportar de la misma manera. De este modo, los diferentes tipos de colas que podemos encontrar son:

  • Colas circulares: el primer y último elemento están unidos.
  • Colas de prioridad: los elementos son tratados en función de su prioridad. Si dos elementos tienen la misma prioridad, prevalece el uso normal de la cola.
  • Bicolas: los elementos pueden añadirse y eliminarse tanto por el principio como por el final.
  • Bicolas de entrada restringida: la inserción se realiza por el final, mientras que la salida puede ser por el principio o el final.
  • Bicolas de salida restringida: la salida solo se realiza por el final, mientras que la entrada puede ser tanto por el principio como por el final.

Para seguir aprendiendo…

InformaticaUV: Tema 12: Colas

MiguelEstructura: que son las colas en la estructura de datos

GadgetInfo: Diferencia entre la pila y la cola

¿Qué es una pila/stack?

Un stack, también conocido como pila, es una estructura de datos que almacena elementos de forma lineal siguiendo una arquitectura de tipo LIFO (Last In – First Out) en lugar de una arquitectura de tipo FIFO. Que utilice una arquitectura de tipo LIFO significa que el último elemento en entrar en el stack es el primero en salir. De este modo, un stack va a trabajar principalmente a través de dos operaciones clave: push y pop.

Al utilizar una arquitectura LIFO, imaginemos al stack como un cubo en el que vamos introduciendo discos. A medida que añadimos discos al cubo estos se van apilando uno encima del otro. Esto implica que el último elemento en ser añadido se va a encontrar siempre en la cima del cubo. A su vez, en caso de querer desapilar los discos del cubo, tendremos que empezar a quitar los discos desde la cima. Por tanto, con este ejemplo vemos claramente cómo funciona un stack, donde tanto la función push (añadir) como la función pop (eliminar) van a actuar siempre sobre el elemento de la cima de la pila.

Además de las funciones push y pop, otras de las tareas que podrá realizar un stack son:

  • Ojear: devuelve el valor de la cima de la pila sin eliminarlo.
  • Duplicar: copia el valor de la cima de la pila en otra variable sin eliminarlo.
  • Intercambiar: hace un swap de los dos primeros valores de la pila.
  • Rotar: desplaza una posición hacia arriba o hacia abajo todos los elementos del stack.

A la hora de implementar un stack, se podrá utilizar tanto un array como una lista enlazada. El elegir una opción u otra será decisión del desarrollador del programa. No obstante, una lista enlazada será siempre más recomendable debido a que el tamaño de un stack suele ser dinámico.

Para seguir aprendiendo…

SwiftByCoding: Estructuras de Datos – Pila

EcuRed: Pila (Estructura de datos)

ProgrammerClick: Estructura de datos JS-stack

¿Qué es una lista enlazada?

Unas de las primeras estructuras de datos que se estudian a la hora de aprender programación son los arrays. Los arrays otorgan una gran eficiencia al código al poder acceder a todos los elementos de la lista de forma inmediata mediante el uso de un índice. No obstante, presenta grandes problemas a la hora de trabajar cuando el tamaño de este se vuelve dinámico. Para solucionar este problema, en el que el tamaño de nuestra lista no va a ser fijo, utilizamos listas enlazadas.

Una lista enlazada es una estructura de datos muy similar al array, con la diferencia de que una lista enlazada no almacena los elementos en zonas contiguas de la memoria. Es decir, los datos no se van a almacenar de forma lineal en memoria, sino que se van a almacenar en diferentes zonas de la memoria sin tener en cuenta la localización del resto de elementos.

Cada elemento de una lista enlazada es un nodo. Cada nodo va a almacenar dos valores. Uno de estos valores será el dato que queramos almacenar en la lista, del mismo modo que almacenábamos datos en un array. El dato restante será una referencia al siguiente nodo de la lista. Esta referencia será la que nos permitirá acceder a los diferentes elementos que conforman la lista, ya que al no estar almacenados de forma contigua, no se permite el uso de un índice como sucede con los arrays.

Lista enlazada estructura

Por tanto, vemos que las listas enlazadas tienen la ventaja de que podemos añadir elementos a las mismas sin tenernos que preocupar porque haya espacio contiguo disponible. Esto hace que la adición sea inmediata y que solo se reserve memoria que sí o sí va a ser utilizada. En contraposición, es necesario recorrer toda la lista para poder acceder a una posición determinada. Es decir, para poder acceder al cuarto elemento necesitamos acceder primero al tercer elemento, dado que es este el único que sabe dónde está almacenado el cuarto elemento. Para acceder al tercer elemento primero tenemos que acceder al segundo, y así sucesivamente hasta llegar al primero. Así, con el uso de listas enlazadas no podemos acceder inmediatamente a cada elemento.

Para seguir aprendiendo…

Cartagena999: Listas enlazadas

PedroGonzálezRuiz: Listas enlazadas en C

CCM: La lista enlazada simple

¿Qué es un array?

Los arrays son de las estructuras de datos más importantes y útiles que existen a la hora de programar. De hecho, el uso de arrays es uno de los primeros conceptos que se enseña a todo aquel que quiere iniciarse en el mundo de la programación. Por ello, si queremos entender el funcionamiento de otras estructuras de datos más complejas, como listas enlazadas o árboles binarios, será de vital importancia saber definir y utilizar de forma eficiente los arrays.

Un array es un conjunto de datos almacenados de forma lineal. Dicho de otro modo, un array es una cadena de datos, dado que todos los elementos del array van a estar almacenados de forma contigua. Un array también puede ser considerado como una lista de elementos, en donde cada uno de ellos ocupa una posición única dentro de la lista.

Desde el punto de vista de la memoria, es importante destacar que los elementos de un array se almacenan de forma contigua. Esto significa que si quiero almacenar 5 elementos en una lista, debe haber al menos 5 espacios contiguos libres en la memoria para poder almacenarlos. Ahora, en caso de tener 5 elementos almacenados, si queremos añadir un elemento más pero no hay espacio contiguo disponible al lado del último elemento, se deberán desplazar esos 5 elementos a una nueva dirección en la que sí se pueda añadir un sexto elemento. Esto nos permitirá acceder a cualquier elemento del array utilizando un índice que nos indique su posición. Si el primer elemento se encuentra en la posición 0x100, al estar almacenados de forma lineal, sabremos que el tercer elemento estará almacenado en la posición 0x102.

VENTAJAS

  • Se puede acceder directamente a cualquier elemento del array utilizando un índice.
  • Muchas estructuras de datos funcionan gracias al uso de arrays.
  • Se pueden definir arrays de varias dimensiones. (Ej. 2D = matriz)

DESVENTAJAS

  • El tamaño de un array no puede modificarse durante la ejecución de un programa, es estático.
  • La inserción y eliminación de elementos del array son más difíciles de implementar y ejecutar.
Estructura de un array

Para seguir aprendiendo…

EcuRed: Arreglos (Informática)

UCO: Arrays y Cadenas en C

Akus: Arrays, arreglos, cadenas o vectores en C – Ejemplos y uso

¿Qué es un inodo?

Como vimos en el post ¿Qué es un directorio?, en Linux todo es un fichero. Por tanto, debe existir alguna manera de almacenar la información de todos los archivos del sistema para poder acceder a ellos. Es aquí donde entran en juego los inodos. Un inodo es una estructura de datos que almacena información sobre un archivo del sistema, exceptuando el nombre de dicho archivo y su contenido.

El motivo por el cual un inodo no necesita saber ni el nombre ni el contenido de un archivo es debido a que este solo trabaja con los metadatos del archivo. Por ejemplo, la información referente a un archivo se guarda en la memoria utilizando bloques de tamaño fijo. Si un bloque se llena pero el archivo todavía contiene información que necesita ser almacenada, el sistema busca un nuevo bloque en el que guardar la información restante. De este modo, una de las tareas del inodo será la de identificar aquellos bloques de la memoria en los que se encuentra almacenado el archivo.

Junto con la identificación de los bloques en los que se encuentra guardado un archivo, un inodo debe ser capaz de gestionar otro tipo de información referente al archivo que está monitoreando. Esta información incluye:

Estructura tabla de inodo
  • Identificador del inodo
  • Tamaño del archivo
  • Número de enlaces al archivo
  • UID del propietario
  • Fecha de última modificación
  • Fecha de último acceso
  • Permisos requeridos para acceder al archivo
  • Cantidad de bloques utilizados para almacenar el archivo
  • Dispositivo en el que el archivo se encuentra almacenado

Para seguir aprendiendo…

InstitutoLinux: ¿Qué son los inodos? – El Camino del Sysadmin

SoloLinux: Que son los inodos en Linux

Linux Terminal: man stat (manual de Linux para ver la información que el inodo almacena del archivo)

¿Qué es una estructura de datos?

Aun sin saberlo, cuando programamos estamos constantemente utilizando diferentes tipos de estructuras de datos. Por este motivo es muy importante saber entender qué es una estructura de datos y los diferentes tipos de estructuras de datos que podemos utilizar a la hora de desarrollar un programa.

En primer lugar, una estructura de datos es una interfaz que nos permite almacenar y organizar la información de forma eficiente en función del uso que se le quiera dar a dicha información. No obstante, independientemente del tipo de datos almacenados, estos siempre se van a guardar en la memoria. Lo importante de esto es la forma en la que los datos se almacenan en la memoria. Por ejemplo, para guardar una cadena de caracteres utilizamos un array, una estructura de datos que almacena los datos de forma secuencial, es decir, un byte detrás de otro.

De este modo, podemos encontrarnos con una gran cantidad de estructuras de datos muy importantes a la hora de programar. Entre las estructuras de datos más frecuentes podemos destacar:

  • Array: la información se almacena de forma lineal o contigua.
  • Lista enlazada: la información se almacena en zonas libres de la memoria. Los datos no se almacenan de forma lineal.
  • Stack: la información se almacena de forma lineal. Tiene la peculiaridad de que el último elemento en entrar al stack es el primero en salir de este. Esta es la única manera de añadir o eliminar información.
  • Cola: la información se almacena de forma lineal. A diferencia del stack, el primer elemento en entrar en la cola es el primer elemento en salir. De nuevo, esta es la única manera de añadir o eliminar información.
  • Árbol binario: la información se almacena de forma jerárquica en forma de nodos. Cada nodo padre puede tener un máximo de dos nodos hijo.
  • Tabla hash: cada elemento de la tabla está asociado a un identificador. De este modo, cada nuevo elemento tendrá un nuevo identificador, como si de una llave de acceso se tratara.
  • Grafo: formado por un conjunto de nodos y vértices que se encuentran interrelacionados entre sí.

Para seguir aprendiendo…

Informatica.uv: ESTRUCTURA DE DATOS

TecnoInformatic: Estructura de datos: descripción, ejemplos y más

Platzi: Qué son y para qué sirven las estructuras de datos

¿Qué es un enlace simbólico?

Un enlace simbólico, también conocido como symlink o symbolic link, es una referencia a otro archivo dentro del sistema. Es decir, un enlace simbólico es un archivo que apunta a otro archivo. De este modo conseguimos acceder a un archivo desde una ruta que no se corresponde con su PATH real.

Todo cambio que se realiza dentro de un archivo simbólico se hace también dentro del archivo real. No obstante, en el momento en el que dicho enlace se rompe, se rompe la conexión entre ambos. Por ejemplo, si eliminamos el archivo simbólico no se eliminará el archivo real, pero ya solo podremos acceder a él desde su PATH real. De este modo, el enlace simbólico surge como alternativa al enlace duro, en el cual si se eliminase el archivo duro, también se eliminaría el archivo real.

Así, el principal uso que se le puede dar a un enlace simbólico es para crear accesos directos. Si por ejemplo queremos mandar una copia del archivo en /etc/program/options/config/archivo al escritorio de un usuario en concreto, podremos crear un enlace simbólico para acceder directamente desde el escritorio sin tener que ir a /etc/program/options/config/archivo cada vez que queramos abrirlo.

Enlace simbólico ejemplo

Para seguir aprendiendo…

Hostinger: Qué son los enlaces simbólicos de Linux

EDteam: ¿Qué son los Enlaces en Linux?

Linux Terminal: man ln (manual de Linux para la creación de enlaces entre archivos)

¿Qué es el backend?

Dentro del mundo del desarrollo web y del desarrollo de aplicaciones es muy habitual escuchar los términos frontend y backend. Ambos hacen referencia a partes muy específicas que hay que tener en cuenta durante el desarrollo de un producto. Mientras que la parte frontend hace referencia a la aplicación desde el lado del cliente, la parte backend se sitúa del lado del servidor para determinar la forma en la que este recibe, procesa y almacena todas las solicitudes que realizan los clientes.

Dado que en este post nos centramos en la parte backend, resaltaremos que es un término utilizado para referirse a la arquitectura interna de una aplicación, o de un sitio web, que garantiza que todos los componentes de la misma funcionan de forma correcta. La parte del backend no presenta una interfaz directa con el usuario, por lo que no existe interacción posible entre cliente-servidor a no ser que se haga por medio de la parte frontend. Del mismo modo, el usuario en ningún momento tendrá acceso visible a la arquitectura interna que conforma la web o la aplicación.

Así pues, entre las acciones más habituales que se suelen llevar a cabo durante el desarrollo de backend, podemos destacar: definir acciones de lógica, establecer las conexiones con las bases de datos, garantizar la seguridad del sitio, hacer un buen uso de los recursos, etc.

Esquema de estructura backend

Por último, en caso de querer profundizar en el desarrollo de backend, es importante saber que los lenguajes más utilizados dentro de este ámbito son:

  • ASP.NET: lenguaje de código abierto que puede ser incrustado en código HTML.
  • PHP: utilizado para desarrollar apps para la web.
  • Ruby: lenguaje orientado a objetos para la creación de webs.
  • Python: lenguaje para construir aplicaciones web y analizar datos, entre muchas otras capacidades.
  • Node.js: entorno JavaScript que presenta una arquitectura basada en eventos para nuestro servidor.

Para seguir aprendiendo…

Surática: Qué es el backend y por qué infravaloras a los desarrolladores

Crehana: ¿Qué es el Backend y cómo usarlo?

IronHack: ¿Qué es un full stack developer?

¿Qué es el frontend?

En muchas ocasiones, al hablar de desarrollo web o de desarrollo de aplicaciones surgen dos términos que, en un primer momento, pueden parecer un poco difíciles de entender. Estos términos son: frontend y backend. En el post de hoy trataremos de entender el concepto de frontend y de cómo puede ayudarnos a la hora de depurar un programa.

El concepto de frontend hace referencia al desarrollo de una aplicación desde el lado del cliente. Es decir, se pone especial interés en el desarrollo de una buena interfaz que sea intuitiva y agradable de usar para el usuario. Cuando visitamos una página web, no nos causa la misma impresión una web que utiliza imágenes para mostrar su contenido que una web que solo utiliza texto. Del mismo modo, opinaremos mucho mejor de una web que nos permita interactuar con el desarrollador de la misma que aquella que no nos deje ofrecer ningún tipo de feedback. Por tanto, podemos observar cómo el frontend se encarga de garantizar al usuario una buena experiencia de uso de la web que visita o de la aplicación que está utilizando.

Frontend pagina web

Además, en caso de querer especializarnos en el desarrollo frontend, no estaremos limitados a un único lenguaje, sino que tendremos varias alternativas entre las que poder elegir. Estas opciones son:

  • HTML: lenguaje de marcado utilizado para el desarrollo de páginas web.
  • CSS: lenguaje de diseño utilizado para simplificar la edición visual de una web.
  • JavaScript: lenguaje de programación utilizado para dotar de interactividad a una web.
  • JQuery: simplifica el uso de JavaScript en el desarrollo web.

Para seguir aprendiendo…

Onion: ¿Qué es frontend?

RyteWiki: Frontend

OpenWebinars: Las 7 skills que debe tener un desarrollador Front End

¿Qué es una macro?

Una macro es una forma de definir un patrón capaz de traducir una entrada proporcionada por el usuario en una salida previamente definida. Así pues, en caso de querer obtener el cuadrado de un número, podemos o bien definir una función o bien definir una macro. En caso de utilizar una macro, tendremos que definir el patrón de entrada (como número(x)) y el patrón de salida ((x)*(x)). El objetivo principal será simplificar tareas complejas, pudiendo asociar las macros a comandos, movimientos de ratón, combinación de teclas, etc.

Ejemplo expansión de macro

Sin embargo, hay que saber que una macro no es lo mismo que una función. Mientras que una función se corresponde con un bloque de código completamente funcional, una macro es simplemente una expansión de una secuencia de entrada a otra secuencia de salida. Es decir, durante el proceso de compilación la macro será expandida a su salida correspondiente, por lo que a la hora de lanzar el programa dicha expansión ya estará presente y no habrá que desplazarse a ninguna otra zona de la memoria.

Por tanto, al requerir de menos instrucciones, una macro puede llegar a ser muy útil. No obstante, hay ocasiones en las que, debido a sus limitaciones, no podremos recurrir al uso de macros. Como ya hemos visto, en una función puede haber varias instrucciones mientras que en una macro no. Debe ser el desarrollador el que decida, en función de sus necesidades, qué utilizar.

Para seguir aprendiendo…

Dccia: Macros

Sistemas: Definición de Macro

It-Swarm: ¿Qué es una macro? ¿Diferencia entre macro y función?

¿Qué son las directivas del preprocesador?

Una directiva del preprocesador es toda línea que empieza por ‘#’ en el archivo utilizado para definir un programa. Las directivas del preprocesador pueden desempeñar diferentes funciones y son interpretadas por el preprocesador antes de que el archivo sea procesado por el compilador. Así, el objetivo principal de las directivas será modificar el código fuente escrito por el desarrollador para dar lugar a un nuevo archivo que ya no disponga de estas directivas pero que estará adaptado a las necesidades del compilador.

Los diferentes tipos de directivas que podemos utilizar en nuestro programas son:

  • #define: para definir una constante del preprocesador.
  • #include: para insertar un header correspondiente a otro archivo.
  • #undef: elimina la definición de una constante del preprocesador.
  • #ifdef: si la macro está definida, retorna TRUE.
  • #ifndef: si la macro no está definida, retorna TRUE.
  • #if: comprueba si se cumple una condición.
  • #else: utilizado en caso de que #if no se cumpla.
  • #elif: combinación de #if y #else.
  • #endif: indica fin de la condición.
  • #error: imprime un error por STDERR.
  • #pragma: utilizado para realizar algunas acciones específicas.

El carácter ‘#’ debe ser el primero de la línea en la que queremos definir nuestra directiva, lo que significa que tampoco puede haber espacios en blanco que le precedan.

Directivas del preprocesador

Para seguir aprendiendo…

AprendeAProgramar: Directivas del preprocesador

MicrosoftDocs: Directivas del preprocesador

UC3M: El Preprocesador

¿Qué es un fichero?

Como ya hemos visto en el post ¿Qué es un directorio?, para el Sistema Operativo Linux y sus derivados todo es un fichero. En caso de que algo no sea un fichero, exclusivamente podrá ser un proceso. Por tanto, debemos tener en cuenta que un fichero (también considerado archivo), puede ser tanto un archivo de texto como un dispositivo de hardware.

Así pues, podemos encontrarnos con diferentes tipos de archivo en función de la tarea que desempeñen dentro del sistema:

  • Ficheros Regulares: contienen programas, ejecutables y archivos de texto.
  • Ficheros Directorios: contienen un listado de los ficheros que hay dentro de ellos.
  • Ficheros Especiales: como archivos con enlace simbólico o archivos de sockets (entre muchos otros).

Cada archivo puede identificarse con un nombre, el cual debe ser único en relación con el resto de archivos que se encuentran en el mismo PATH. Esta identificación suele ir acompañada de una extensión que indica el tipo de archivo y el tipo de contenido del mismo. En función de la extensión del archivo, este podrá ser tratado de una manera u otra por los diferentes programas del sistema.

Archivos y ficheros

Para seguir aprendiendo…

Concepto.de: Archivo en Informática

Persoal.Citius: Tipos de ficheros y atributos

Linux Terminal: man file (comando de terminal para indicar el tipo de archivo).

¿Qué es un directorio?

Si recién te inicias en el mundo de la programación, Linux, administración de sistemas, etc., es muy probable que te estés preguntando qué es un directorio y en qué se diferencia un directorio de un fichero. Pues bien, en primer lugar debemos considerar que en Linux todo es un fichero. Todo aquello que se encuentre conectado al ordenador, como un dispositivo de almacenamiento externo, también será considerado como un fichero.

Para poder funcionar correctamente, todos los ficheros presentes en este sistema se organizan en torno a una estructura jerárquica establecida por el FHS (Filesystem Hierarchy Standard). Así pues, un directorio será considerado como un fichero capaz de almacenar más ficheros dentro de sí, como si de un archivador se tratara. Comúnmente es lo que se conoce como carpeta. Gracias al uso de directorios, se establece la estructura jerárquica mencionada anteriormente, encontrándonos con diferentes directorios en función del contenido que almacenen:

  • / es el directorio raíz o directorio principal. A partir de él se establece todo el sistema de archivos presente en el ordenador.
  • /bin contiene archivos binarios de algunos programas importantes que pueden ser ejecutados como comandos por cualquier usuario.
  • /boot contiene los archivos de arranque del sistema.
  • /dev en su interior se encuentran los ficheros correspondientes a los distintos dispositivos utilizados.
  • /etc posee los ficheros de configuración de los diferentes programas presentes en el sistema.
  • /home es un directorio que contiene los directorios de los diferentes usuarios del sistema.
  • /sbin contiene binarios que solo pueden ser ejecutados por el administrador del sistema.
Estructura de directorios

Estos son solo algunos de los directorios más importantes que podemos encontrar dentro del sistema. Además, es importante saber y recordar que un directorio puede incluir varios directorios, de la misma manera en la que hasta ahora podíamos crear una carpeta dentro de otra para gestionar nuestros archivos.

Para seguir aprendiendo…

Dis.UM: Directorios

Geekland: Estructura de directorios en GNU-Linux

Linux Terminal: mkdir (comando para crear directorios)

A %d blogueros les gusta esto: