LINUX

Entorno de proceso de Linux explicado para principiantes

Los procesos son fundamentales para el sistema operativo Linux. Para comprender cómo funciona un proceso de Linux, es importante conocer su entorno. Por ejemplo, cosas como cómo se llama a la función main (), cómo se pasan los argumentos de la línea de comandos a un programa, cómo un programa accede a las variables de entorno, cómo se distribuye un proceso en la memoria y diferentes formas de terminar un proceso. En esta serie de artículos de dos partes, nos basaremos en todos estos aspectos desde el punto de vista de los principiantes.

proceso de linux

La función main ()

Como programador, generalmente sabemos que main () es la primera función que se llama cuando se ejecuta un programa. Pero, ¿alguna vez pensaste quién lo llama? ¿Qué sucede antes de que se ejecute main ()?

Bueno, cada vez que ejecuta un programa a través de la línea de comando, aquí hay una descripción general de lo que sucede:

  • El caparazón llama a uno de los familia de funciones ejecutivas con nombre binario, recuento de argumentos (argc) y matriz de argumentos (argv).
  • Se invoca una función de controlador del kernel que pasa toda la información al kernel. Esta información consta de un puntero a la cadena de nombre del programa, un puntero de matriz argv, un puntero de matriz de variable de entorno y más.
  • Luego, el kernel determina el formato de archivo ejecutable (por ejemplo: ELF o a.out) que se está utilizando, en función del cual configura estructuras de datos relacionadas como el tamaño del código, el inicio del segmento de datos, el inicio del segmento de la pila, etc.
  • El kernel luego asigna páginas en modo de usuario para el proceso y copia la matriz de argumentos y las variables de entorno a esas direcciones de página asignadas.
  • Finalmente, se llama a la función _start (), que es el punto de entrada a un ejecutable de C. _start () luego llama a main () y le pasa toda la información requerida.

Eso fue solo una breve descripción general. Si desea comprender en detalle todos y cada uno de los pasos que ocurren entre el momento en que se ejecuta un programa y cuando se llama a main (), consulte este excelente tutorial.

Argumentos de la línea de comandos

Ahora entendamos cómo un programa accede a los argumentos de la línea de comandos. Tomemos un ejemplo del siguiente código:

#include<stdio.h>

int main(void)
{
printf("n This is a test programn");
return 0;
}

Entonces, como puede ver, es un programa muy básico que simplemente imprime una cadena en la salida. Ahora, si desea que el programa acepte argumentos de línea de comando, primero debe cambiar la lista de argumentos de la función main ().

#include<stdio.h>

int main(int argc, char* argv[])
{
printf("n This is a test programn");
return 0;
}

En el código anterior, argc es un número entero que representa el número de argumentos (incluido el nombre del binario) y argv es una matriz que contiene los argumentos de la línea de comandos como cadenas. Aquí hay algunas modificaciones más que muestran cómo puede acceder a los argumentos de la línea de comandos en el código:

#include<stdio.h>

int main(int argc, char* argv[])
{
printf("n This is a test programn");

if(argc != 3)
{
printf("n The program accepts 3 argumentsn");
return -1;
}

int temp = 0;

while(temp<3)
{
printf("n %s n", argv[temp]);
temp++;
}

return 0;
}

El programa ahora hace uso de argc y argv. Se repite en tiempos argc e imprime todos los argumentos de la línea de comandos pasados ​​al programa. Aquí está la salida del programa cuando se ejecuta:

$ ./arg prog 5

This is a test program

./arg

prog

5

Entonces puede ver que el programa, cuando se ejecuta a través del shell, imprime todos los argumentos de la línea de comando en stdout.

Lista de entornos

Además de los argumentos de la línea de comandos, un programa también recibe información sobre el contexto en el que fue invocado a través de la lista de entornos que se le pasó. Una lista de entornos estándar contiene información como: directorio de inicio del usuario, tipo de terminal, configuración regional actual, etc. también puede definir variables adicionales para otros fines.

Por convención, las variables de entorno se definen en el siguiente formato:

nombre = valor

Los nombres se definen en mayúsculas, pero esto es solo una convención.

Al igual que la lista de argumentos de la línea de comandos, la lista de entornos también es una matriz de punteros que apuntan a la dirección de una cadena terminada en nulo. Y se puede acceder a la lista de entornos a través de una variable global reinar, que se define como un puntero a un puntero a char.

A continuación, se muestra un ejemplo de cómo utilizar la lista de entornos en un programa en C:

#include<stdio.h>

extern char **environ;

int main(int argc, char* argv[])
{
printf("n This is a test programn");
char **tmp = environ;

while(*tmp != '')
{
printf("n %s n", *tmp);
tmp++;
}

return 0;
}

Entonces, como puede ver, la variable de entorno ya está definida como una variable global, por lo que debe declararla como una variable externa. Usando una variable de puntero temporal, a la que le asigna la dirección contenida por la variable de entorno, el programa recorre e imprime cada variable de entorno.

Aquí está el resultado:

This is a test program

XDG_VTNR=7

SSH_AGENT_PID=1508

XDG_SESSION_ID=c2

CLUTTER_IM_MODULE=xim

SESSION=ubuntu

GPG_AGENT_INFO=/run/user/1000/keyring-TfWiqP/gpg:0:1

TERM=xterm

XDG_MENU_PREFIX=gnome-

SHELL=/bin/bash

VTE_VERSION=3409

WINDOWID=69206026

UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1441

GNOME_KEYRING_CONTROL=/run/user/1000/keyring-TfWiqP

GTK_MODULES=overlay-scrollbar:unity-gtk-module

USER=himanshu

...

...

...

Conclusión

En este artículo, aprendimos cómo se llama a la función main () y cómo se puede acceder a los argumentos de la línea de comandos y la lista de entornos en el código.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar