post

Proceso – programación en el shell

proceso colorful toothed wheels
Photo by Digital Buggu on Pexels.com

Un proceso es una instancia en ejecución de un programa. Cuando se ejecuta un programa en el shell, se crea un nuevo proceso para ese programa.

Fork y Exec

  • La llamada al sistema fork() se utiliza para crear un nuevo proceso que es una copia exacta del proceso padre. Después de hacer un fork(), ambos procesos (el padre y el hijo) continúan ejecutando el mismo código a partir de ese punto. El hijo se diferencia del padre por su PID, que es 0 después de un fork() exitoso.
  • La llamada al sistema exec() se utiliza para reemplazar la imagen del proceso actual con un nuevo programa. Después de un exec(), el programa original se detiene y es reemplazado por el nuevo programa.
# Ejemplo de fork y exec
# Este script crea un nuevo proceso hijo que ejecuta un programa diferente

# Nombre del script: mi_script.sh

echo "Inicio del script (PID $$)"

# Crear un nuevo proceso hijo
./mi_programa_hijo.sh &
child_pid=$!

echo "Proceso hijo creado con PID $child_pid"

# Esperar a que el proceso hijo termine
wait $child_pid

echo "Fin del script"
# Contenido de mi_programa_hijo.sh
# Este es el programa que será ejecutado por el proceso hijo

# Nombre del script: mi_programa_hijo.sh

echo "Este es el programa hijo (PID $$)"

Comunicación entre Procesos (IPC):

Los procesos pueden comunicarse mediante mecanismos de IPC (Inter-Process Communication). Los pipes (|) permiten la comunicación entre la salida de un proceso y la entrada de otro. Además, los archivos temporales, la memoria compartida y las colas de mensajes son ejemplos de mecanismos IPC más avanzados.

# Ejemplo de comunicación mediante pipes
# Este script utiliza un pipe para enviar la salida de un comando a otro

# Concatenar dos archivos y contar las líneas resultantes
cat archivo1.txt archivo2.txt | wc -l

Señales:

Las señales son mecanismos de comunicación asincrónica entre procesos o entre el kernel y los procesos. Puedes enviar señales a los procesos utilizando comandos como kill. Por ejemplo, kill -SIGTERM PID envía la señal de terminación (SIGTERM) a un proceso con el PID especificado.

# Ejemplo de envío de señal a un proceso
# Este script crea un proceso en segundo plano y luego envía una señal para terminarlo

# Iniciar un proceso en segundo plano
./mi_programa.sh &

# Obtener el PID del proceso en segundo plano
child_pid=$!

# Enviar una señal para terminar el proceso
kill -SIGTERM $child_pid

Procesos en Segundo Plano:

Puedes ejecutar procesos en segundo plano agregando & al final del comando. Esto libera la terminal para que puedas seguir ingresando comandos mientras el proceso se ejecuta en segundo plano.

# Ejemplo de ejecución de un proceso en segundo plano
# Este script ejecuta un programa en segundo plano y continúa con otras tareas

# Ejecutar un programa en segundo plano
./mi_programa.sh &

# Continuar con otras tareas sin esperar a que el programa termine
echo "Haciendo otras cosas mientras mi_programa.sh se ejecuta en segundo plano"

Despacho de Trabajo y Prioridades:

Puedes ajustar la prioridad de un proceso usando comandos como nice o renice. Esto puede afectar la cantidad de tiempo de CPU que el proceso recibe en comparación con otros procesos en ejecución.

# Ejemplo de ajuste de prioridad de un proceso
# Este script ejecuta un programa con una prioridad más baja usando el comando nice

# Ejecutar un programa con prioridad más baja
nice -n 10 ./mi_programa.sh

Manejo de Errores:

Al ejecutar programas en el shell, es importante manejar los errores adecuadamente. Puedes verificar el código de salida de un programa utilizando $?. Un valor de 0 generalmente indica éxito, mientras que otros valores indican algún tipo de error.

# Ejemplo de manejo de errores
# Este script ejecuta un programa y verifica su código de salida para determinar el éxito o el error

# Ejecutar un programa
./mi_programa.sh

# Verificar el código de salida
if [ $? -eq 0 ]; then
    echo "Éxito"
else
    echo "Error"
fi

Estos son solo algunos aspectos clave del manejo de procesos y llamadas al sistema en el contexto de la programación en el shell. La combinación de estas herramientas proporciona una gran flexibilidad para la creación y gestión de procesos en entornos de línea de comandos.

Leave a Reply

Your email address will not be published. Required fields are marked *