Programación

¿QUÉ SUCEDE CUANDO ESCRIBE «ls — l *.c» EN EL SHELL?

Posteado el 3 de mayo de 2023 por admin

¿QUÉ SUCEDE CUANDO ESCRIBE «ls — l *.c» EN EL SHELL?

Autor: Iver Sutizal

¿Qué es Shell?

En informática, el shell o intérprete de comandos es el programa informático que proporciona una interfaz de usuario para acceder a los servicios del sistema operativo.

Ahora en Linux el Shell se encarga de establecer la comunicación entre el kernel y el usuario del Sistema Linux, es decir, es una interfaz con nuestro Sistema Operativo. Entonces gracias a él podremos dar las órdenes necesarias para que nuestro sistema informático realice las tareas que necesitamos.

¿Alguna vez se ha preguntado qué está sucediendo realmente bajo el capó desde la CLI hasta el nivel del Kernel cuando escribe el comando ‘ls’? ¡Vamos a averiguarlo!.

¿QUÉ ES LS?

Según el manual de ls, su nombre es «list directory contents», y su función es:

ls -l *.c es un comando con argumento para enumerar todos los archivos y directorios en el directorio actual que terminan con la extensión .c Se usa en muchas distribuciones de Linux / Unix.

Aquí, la pregunta sería.

¿Qué está sucediendo realmente dentro de nuestro caparazón?

¡Alimentando el comando a la fiesta! : Después de ingresar «ls -l *.c», el controlador del teclado se da cuenta de que se han ingresado caracteres y los inserta en el shell, la función que se encarga de recibir la cadena de comandos es getline(). Luego se divide en tokens excluyendo espacios en blanco, la función que se encarga de dividir en tokens es strtok(), para este ejemplo sería así

token[0] = «ls»

token[1] = «-l»

token[2] = «*.c»

Ahora nuestro comando ahora tiene 3 tokens, ‘ls’, ‘-l’ y ‘*.c’. Esto se coloca en una matriz de cadenas. Todo este proceso se conoce como tokenización.

Estas funciones ya están predefinidas por medio de una biblioteca.

*Para el strtok() es el Liberia #include <string.h>

*Para getline() es la biblioteca #include <stdio.h>.

Si quieres más información sobre su funcionamiento puedes consultarla en la web.

https://man7.org/linux/man-pages/man3/strtok.3.html

Interpretar y encontrar el ejecutable para el comando: Después de eso, el bash interpreta el comando. La primera búsqueda del comando ‘ls’ se realiza a través de $PATH.

$PATH es una variable de entorno que contiene las rutas de todos los programas ejecutables.

Antes de mirar el PATH, primero necesitamos dividir todo el path, ya que el PATH originalmente viene como una cadena larga separada por «:»

Ahora dividimos el camino de arriba con la función strtok(), poniéndolo como el separador «:».

Ahora esto sería así.

La búsqueda llama a una serie de funciones como find_user_command() ,find_user_command_in_path , find_in_path_element. Cada ruta de la variable PATH busca el ejecutable que corresponde al comando ‘ls’. BASH invoca la función stat() para comprobar si hay un ejecutable coincidente en cada ruta.

Extracción del ejecutable a la memoria: Después de todo esto, cuando el archivo se encuentra en ‘/usr/bin/ls’, BASH ejecuta el comando execve() para ejecutar el archivo. Hay muchas otras cosas que deben lograrse antes de que se ejecute el binario /usr/bin/ls: el programa debe leerse desde el disco, su formato binario debe encontrarse y se debe llamar al código de manejo adecuado a través del cual se leerá el binario en la memoria.

Y eventualmente ejecutando el comando: Por último, pero no menos importante, el programa está en la memoria y está a punto de ejecutarse cuando tenga la oportunidad. Sin embargo, ¿cómo se leen los directorios y archivos del disco por ‘ls’? Para ello, se ejecuta internamente una lista de funciones para acceder al resultado final. La utilidad ls hace uso de una función para leer el contenido del directorio, que a su vez invoca una llamada al sistema para leer la lista de archivos en el directorio consultando las entradas de inodo del sistema de archivos subyacente. Ls se formatea en función del sistema de archivos en el que se ha especificado el archivo. Tan pronto como se hayan recuperado todas las entradas, la llamada al sistema devuelve. Finalmente, el Shell vuelve a imprimir el mensaje. Luego, el mensaje se almacena como una variable de entorno llamada PS1. A continuación, la lista de archivos se devuelve al símbolo del sistema.

Fork and execve

Fork es una función que nos ayudará mucho, porque cuando finalmente ejecutemos un comando, terminará la ejecución del shell, pero fork hará que esto no suceda, haciendo un proceso hijo que morirá mientras que su padre permanecerá igual.

Para que el proceso padre espere a que el niño complete su función, necesitará otra llamada al sistema conocida como espera.

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

Suscríbete a nuestro Newsletter